in reply to Re: Just when you thought you'd got it: 'foreach $f (@foo)' vs 'foreach (@foo)'
in thread Just when you thought you'd got it: 'foreach $f (@foo)' vs 'foreach (@foo)'

I was about to tell you that I'm not sure whether I would recommend it because the

while (<>) {...}

is associated with quite a lot of dwimmy magic that would would vanish if you amend the construct that way, but when I was about to give you an example it turned out that it was actually a counter-example showing I was plainly wrong:

pilsner:~ [11:58:42]$ perl -MO=Deparse -e 'while (<>) {}' while (defined($_ = <ARGV>)) { (); } -e syntax OK pilsner:~ [11:59:05]$ perl -MO=Deparse -e 'while (local $_=<>) {}' while (defined(local $_ = <ARGV>)) { (); } -e syntax OK

Thus perl is smart enough to still add the definedness test even in that case: I stand corrected, and you taught me something new. I am fairly sure this was not the case with all perls, but I have now tested with 5.8.8 which is the oldest one I have currently access to, and it supports this feature. I don't know when it was actually introduced. I used to believe that it would only work with a variable assignment, but not if a local (or anything else) was preprended to it...

I still feel like claiming that in most cases using while (<>) {...} responsibly would be enough.

--
If you can't understand the incipit, then please check the IPB Campaign.

Replies are listed 'Best First'.
Re^3: Just when you thought you'd got it: 'foreach $f (@foo)' vs 'foreach (@foo)'
by repellent (Priest) on Oct 16, 2008 at 17:39 UTC
    Yes, the dwimmy magic that adds the definedness test is still present. That's one thing I noticed, much to my relief.

    The issue with while (<>) { ... } is that the while clobbers $_. This makes debugging harder especially when it is used in some function/module somewhere else.

    Sins of Perl Revisited explains that module authors must be educated to localize $_ before changing it.

    If by "most cases", you mean not using while (<>) { ... } in a function/module, then yeah, I suppose it would be enough. But who's to say that some day, the existing code won't be packaged up wholesale and used elsewhere, causing interesting bugs ;-)