in reply to Re: while(<>) { ... } considered harmful
in thread while(<>) { ... } considered harmful
Unless I totally misunderstood the above comments -- which is possible as I just briefly skimmed them -- the problem here is not that map and grep don't localize $_, but that they may execute code that may alter the value of $_, which in this case is aliased to a constant. Consider this code:
$_ = 'Ovid'; %hash = map { $_ => 1 } qw/ foo bar baz /; print;
That code will print 'Ovid' because $_ has been localized within the map statement. Now, if you try to alter the $_, your code fails because you're trying to alter a constant:
$_ = 'Ovid'; %hash = map { $_ .= 'asdf'; $_ => 1 } qw/ foo bar baz /; print;
To get around that, you can do this:
$_ = 'Ovid'; %hash = map { local $_ = $_; $_ .= 'asdf'; $_ => 1 } qw/ foo bar baz /; print;
That allows you to assign the aliased constant to a real variable, thus avoiding the problems outlined in this thread.
Cheers,
Ovid
Join the Perlmonks Setiathome Group or just click on the the link and check out our stats.
|
---|