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


in reply to Why Perl boolean expression sometimes treated as lvalue?

In Perl, arguments are passed by reference, not by value. This is what perlsub means when it says: “The array @_ is a local array, but its elements are aliases for the actual scalar parameters.”

The subroutine call a($x && $y) causes the Perl interpreter to evaluate the boolean expression $x && $y to determine which variable is to be aliased. If $x is false, the expression short-circuits, so a reference to $x is passed in to the sub; but if $x is true, short-circuiting does not occur, and so it is a reference to $y that is passed in to the sub.

So it is misleading to say that the boolean expression works as an l-value. Within sub a, the boolean expression is never seen — only the reference to either $x or $y — and it is this reference which works as an l-value.

I haven’t found anything in the documentation to explain the process by which Perl derives a reference (“alias”) from a complex expression given as an argument to a subroutine. It might be useful to know — but, in general, it’s safer and clearer to keep things simple and just pass a variable or a value.

Hope that helps,

Athanasius <°(((><contra mundum Iustus alius egestas vitae, eros Piratica,

Replies are listed 'Best First'.
Re^2: Why Perl boolean expression sometimes treated as lvalue? (perlop, precedence)
by Anonymous Monk on Feb 08, 2013 at 12:37 UTC

    perlop perlop perlop , precedence is everything :)

    $ perl -E " print ( 1 && 2 ) 2 $ perl -E " sub ff { ++$_[0] } my($f,$a)=(1,5); ff( $f && $a ); say $f +; say $a; " 1 6