http://qs1969.pair.com?node_id=347099


in reply to Mysterious for behavior

Hi, what you really wrote is this: $_ is a alias to $i and $i is 1.
my $i; for ( ($i=3, $i=2, $i=1) ) { print("$_ and $i\n"); }
Boris

Replies are listed 'Best First'.
Re: Re: Mysterious for behavior
by Roy Johnson (Monsignor) on Apr 21, 2004 at 19:32 UTC
    Actually (and this was the point of confusion), I made $_ an alias to $i three times. I would have understood if it had acted like
    for (scalar($i=3, $i=2, $i=1)) { print "$_ and $i\n"; }
    where each assignment happens in turn, because of the comma operator, and $_ is aliased to the final result ($i) once. But that didn't happen. I expected each assignment expression to yield the value of its right-hand side, but Perl evaluated it more like:
    $i=3, $i=2, $i=1; for ($i, $i, $i) { print "$_ and $i\n"; }

    The interesting part

    I can get the effect I expected by doing this:
    for (0+($i=3), 0+($i=2), $i=1) { print "$_ and $i\n"; }

    The PerlMonk tr/// Advocate
      I can get the effect I expected by doing this:
      for (0+($i=3), 0+($i=2), $i=1) { print "$_ and $i\n"; }
      In your example you create
      for ( temp, temp2, $i ) {
      Boris

      Maybe a better way to think about it is that you created an array of three elements, each element is pointing to the $i variable. However, because you are initializing $i for each element in the list, the elements in the list all contain the same value (in this case, the final value of $i: 1), since they're pointing to the current value of $i.

      Scalar assignments yield the lvalue on the left, not the value on the right. Now can you make that fit with your "interesting part" and understand why it works as it does?
        I didn't have any difficulty understanding why the interesting part worked.

        The PerlMonk tr/// Advocate