In perl, it makes no sense at all.
Operand evaluation order is actually well defined and system-independent even though it's not documented for most operator. Operands are evaluated as late as possible, left-to-right except for assignment operators which are right-to-left. (Exponentiation's operand evaluation order is left-to-right, so its operand evaluation order differs from its operator associativity.)
${ X() } . ${ X() } concat( deref( X() ), deref( X() ), ) ${ X() } . ' ' . ${ X() } concat( concat( deref( X() ), ' ', ), deref( X() ), )
The key here is that ${ X() } returns $x itself, not a copy of it.
use strict; use warnings; use feature qw( say ); {my$x=0; sub X{++$x;\$x}} sub concat { $_[0] . $_[1] } sub deref :lvalue { ${ $_[0] } } # 22 say concat( deref( X() ), deref( X() ), ); # 3 4 say concat( concat( deref( X() ), ' ', ), deref( X() ), );
In reply to Re^5: Order of evaluation/interpolation of references (op order)
by ikegami
in thread Order of evaluation/interpolation of references
by Anonymous Monk
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |