On 29/04/2011 13:17, C.DeRykus wrote:

This happened in 5.10 ... at least after 5.8.

From: http://rt.perl.org/rt3/Ticket/Display.html?id=89024

     Just like the argument list of sub calls, The list over which
foreach
     iterates is evaluated in lvalue context as required by foreach's
     aliasing property.

Ex:
     perl -MData::Dumper -le '
          for ( @y{qw(a b)} ) {$_ = "foo" unless defined $_} ;
          print Dumper \%y'

     $VAR1 = {
                      'a' =>  'foo',
                      'b' =>  'foo'
                   };


grep's aliasing creates the same lvalue context:

    perl -MData::Dumper -le '
            @x = grep {$_ = "foo" unless defined $_} @y{ qw( a b )};
            print Dumper \%y'

    $VAR1 = {
                     'a' =>  'foo',
                     'b' =>  'foo'
                   };


I think that is intuitive for a for loop. I would expect

  for (@hash{qw/a b c/}) {
    :
  }

to execute three times, regardless of the state of the hash. But for

  my @list = @hash{qw/a b c/};

to perform so very differently from

  my @list = grep 1, @hash{qw/a b c/};

is a surprise.

I can anticipate reasons for leaving things this way, one of which is
that there must be code out there that modifies $_ in the grep block,
but it is certainly a shame and a major pitfall.

Rob

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