http://www.perlmonks.org?node_id=195944


in reply to while(<>) { ... } considered harmful

'scuse my ignorance of nether regions below Perl's skirts, but would it impose a huge performance penalty for map and grep to localise $_ on entry?

I visualise them as subs with their own local scope. Would a local $_; at the top cost so very much?


Well It's better than the Abottoire, but Yorkshire!

Replies are listed 'Best First'.
Re: Re: while(<>) { ... } considered harmful
by Ovid (Cardinal) on Sep 08, 2002 at 00:58 UTC

    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.