in reply to Why does the first $c evaluate to the incremented value in [$c, $c += $_] ?

The relevant code is my @a = ( $c, $c += 1 );. It does the following:

  1. $c is put on the stack. (The scalar, not its value.)
  2. $c is incremented.
  3. $c is put on the stack.
  4. An array is created.
  5. For each of the elements on the stack,
    1. A copy is made an placed at the end of the array.

As you can see, $c has already been incremented by the time you assign it to the array (twice). It's unwise to modify a variable in the same expression as you read it.

You'll get the same result from

use Data::Alias qw( alias ); my @stack; alias push @stack, $c; alias push @stack, $c += 1; my @a = splice(@stack);

Now consider my @a = ( $c + 0, $c += 1 );. It does the following:

  1. A new scalar is created from the result of the addition of the value of $c and zero.
  2. It's placed on the stack.
  3. $c is incremented.
  4. $c is put on the stack.
  5. An array is created.
  6. For each of the elements on the stack,
    1. A copy is made an placed at the end of the array.
use Data::Alias qw( alias ); my @stack; alias push @stack, $c + 0; alias push @stack, $c += 1; my @a = splice(@stack);

This places the original and the new value of $c in the array.