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


in reply to Context: compile-time vs. run-time

perl -le 'my $f = 1; ($f > 0 ? @a : $a ) = ("a", "b", "c")'
Assignment to both a list and a scalar at -e line 1, at EOF

Keep in mind that there are two different "=" operators: the list assignment operator (aassign) and the scalar assignment operator (sassign). The selection of the operator is based on whether the LHS of the assignment is list-ish or scalar-ish. The reason the above doesn't compile isn't the inability to change context at run-time, it's the inability to select an operator.

The two operators compared:

Context Imposed on OperandsStack on InputInEvaluates ToStack on Output
sassignscalarTwo SVsscalarLHS as an aliasOne SV
listLHS as an aliasOne SV
lassignlistTwo marked lists of SVsscalarNumber of items in list returned by the RHSOne SV
listLHS as a list of aliasesOne (unmarked) list of SVs

Notice the significant differences in how Perl needs to setup the stack before the operator is called, making the choice of operators crucial.