in reply to Re^2: Reassigning $_ in loop doesn't stick
in thread Reassigning $_ in loop doesn't stick

ikegami,
I sent you a /msg to this affect but since I found a conflict in map, I figured I would post for everyone's benefit. What version of perl is this and why doesn't it agree with the documentation (map aliases not copies)?

Update: Confirmed with 5.10.0 that map aliases not copies
I am guessing I am not understanding what you are saying.

#!/usr/bin/perl use strict; use warnings; my @foo = 'a' .. 'd'; map { $_ = uc($_) } @foo; # look Mom, map in a void context print "@foo\n";

Cheers - L~R

Replies are listed 'Best First'.
Re^4: Reassigning $_ in loop doesn't stick
by kyle (Abbot) on Jan 21, 2009 at 21:31 UTC

    Both grep and map operate on aliases in their block, as you show.

    What ikegami is showing is that grep will return aliases to the elements of the list it worked on while map will return copies (even if it hasn't modified them).

Re^4: Reassigning $_ in loop doesn't stick
by ikegami (Patriarch) on Jan 21, 2009 at 21:33 UTC

    The post to which you replied discusses whether map returns aliases or not. This is not related to whether map operates on an alias when executing the code block.

    What version of perl is this and why doesn't it agree with the documentation

    The docs (for 5.10.0) specify that grep returns aliases, but they are silent on whether map returns aliases or not.

    Confirmed with 5.10.0 that map aliases not copies

    Your snippet discards the return value of map without checking whether it's an alias or not.

      ikegami,
      I thought this might be what you meant on my way home from work. I just can't think of a good reason for it. It would be quite interesting if it worked in assignment (my $alias_to_foo = grep $_, $foo;) but it doesn't. So what benefit is there that the return value is an alias into the original list?

      Cheers - L~R

        • Efficiency (speed and memory).
        • You can pass it to for, a function, etc to be modified.
        • Use the return as an lvalue. Well, you can take a reference to it at least.
        • Simplicity. It takes extra work to make the copy.

        Mainly, I figure it just happened to work that way. And since there's no reason to change it, they decided to document it.