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