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.
|