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 Operands||Stack on Input||In||Evaluates To||Stack on Output|
|sassign||scalar||Two SVs||scalar||LHS as an alias||One SV|
|list||LHS as an alias||One SV|
|lassign||list||Two marked lists of SVs||scalar||Number of items in list returned by the RHS||One SV|
|list||LHS as a list of aliases||One (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.