>>>>>> "BRH" == Bryan R Harris <bryan_r_har...@raytheon.com> writes:
> 
>   BRH> Much to my chagrin I realized this morning that this notation:
> 
>   BRH>     while(<FILE>) {
> 
>   BRH> evaluates as:
> 
>   BRH>     while(defined($_ = <FILE>)) {
> 
>   BRH> ... and NOT as:
> 
>   BRH>     while(defined(local $_ = <FILE>)) {
> 
>   BRH> I had a subroutine that was set up to read and parse a file, but it was
>   BRH> trashing the value of $_ out in the main program!
> 
>   BRH> If I use:
> 
>   BRH>     foreach (<FILE>) {
> 
>   BRH> ... it works perfectly (though slurping the whole file right at the
> start, I
>   BRH> know).
> 
> how would that work any better as $_ is still set to each element?

Because somehow the $_ is localized with foreach where it is not with the
implicit (?) while loop.


>   BRH> My question is:  why?  Seems like such an easy thing to have done.
> 
> it would be better for you to use lexical vars then you wouldn't need to
> worry about action at a distance with $_. also the code reads better as
> you know what you are working with instead of the generic $_. this are two
> of the reasons why i always teach to avoid $_ in most code. use it where
> you must (grep, map, foreach modifier) or where it really helps out the
> code. for line loops, it doesn't help at all so avoid it. and lexicals
> are safer and if well named, better for maintaining the code.

I actually love using $_.  It saves all kinds of typing when doing lots of
regex'ing, e.g.:

while(<FILE>) {
    s/^\s*#.+//;
    s/\^/**/g;
    s/(\d)e(\d)/$1E$2/g;
    if (!/\S/) { push @lines, $_; }
}

I don't see why it "doesn't help at all" in these kinds of loops.

- Bryan





-- 
To unsubscribe, e-mail: beginners-unsubscr...@perl.org
For additional commands, e-mail: beginners-h...@perl.org
http://learn.perl.org/


Reply via email to