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


in reply to question 1st - undefined behaviour

If you want to see what's happening, you can step through the following:
use strict; use warnings; use Data::Alias qw( alias ); my @stack; # Increments the scalar on the stack. sub preinc { alias my $i = pop(@stack); ++$i; alias push @stack, $i; } # Increments the scalar on the stack. # Returns a new scalar with the original # value of the scalar on the stack. sub postinc { alias my $i = pop(@stack); my $j = $i; alias push @stack, $j; ++$i; } sub add { alias my $j = pop(@stack); alias my $i = pop(@stack); my $sum = $i + $j; alias push @stack, $sum; } { my $x=5; # $x + ++$x + $x++ alias push @stack, $x; alias push @stack, $x; preinc; add; alias push @stack, $x; postinc; add; print "$stack[-1]\n"; # 18 }

(alias $x = $y; represents the copying of a C pointer rather than copying the actual scalar.)