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:
which gives: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 { $_ = '!!!' } ;
I=!!! II=!!! III=!!! IV=!!! -- firstbornso we managed to keep the firstborn safe, but the loop is littered with bodies.
Of course, without the local $_, ie: the common or garden:
everybody gets it:while (<$FH>)
I=!!! II=!!! III=!!! IV=!!! -- *undef*
Better is to lexically scope the $_, thus:
so that we can still implicitly use $_ in the loop, AND it now works (hurrah!):while (my $_ = <$FH>)
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.
In reply to Re^2: Just when you thought you'd got it: 'foreach $f (@foo)' vs 'foreach (@foo)'
by gone2015
in thread Just when you thought you'd got it: 'foreach $f (@foo)' vs 'foreach (@foo)'
by gone2015
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |