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 would recommend the idiom:
while (local $_ = <$FH>)

This is certainly best practice -- it stops the while from mangling the caller's precious $_.

Unfortunately, being a good citizen doesn't prevent some mad person from running amuck with an Uzi and blowing away the firstborn.

Consider:

use strict ; use warnings ; my $mock = "I\nII\nIII\nIV" ; open my $FH, '<', \$mock ; $_ = 'firstborn' ; while (local $_ = <$FH>) { chomp ; print "$_=" ; tr/IV/iv/ ; amuck() ; print "$_ " ; } ; if (!defined($_)) { $_ = '*undef*' ; } ; print " -- $_\n" ; sub amuck { $_ = '!!!' } ;
which gives:
  I=!!! II=!!! III=!!! IV=!!!   -- firstborn
so we managed to keep the firstborn safe, but the loop is littered with bodies.

Of course, without the local $_, ie: the common or garden:

while (<$FH>)
everybody gets it:
   I=!!! II=!!! III=!!! IV=!!!   -- *undef*

Better is to lexically scope the $_, thus:

while (my $_ = <$FH>)
so that we can still implicitly use $_ in the loop, AND it now works (hurrah!):
   I=i II=ii III=iii IV=iv   -- !!!
OK. The firstborn has gone, but that serves you right for leaving it unattended outside in the push-chair.

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:55 UTC
    The use of my on Perl special variables didn't come till a recent version of Perl, I believe.

    Nevertheless, I think it is a matter of usage whether to lexically scope my $_ within while or dynamically scope it local $_. I can foresee having an amuck() function wanting to read $_ instead of clobbering it.

    When I see code like $_ = ... alarm bells in me start ringing! ... and I drone into the need to localize ... :)