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.
In reply to Re: Context: compile-time vs. run-time
by ikegami
in thread Context: compile-time vs. run-time
by shmem
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |