The symbol = is compiled into one of two assignment operators:
- A list assignment operator is used if the left-hand side (LHS) of a = is some kind of aggregate.
- A scalar assignment operator is used otherwise.
The following are considered to be aggregates:
- Any expression in parentheses (e.g. (...))
- An array (e.g. @array)
- An array slice (e.g. @array[...])
- A hash (e.g. %hash)
- A hash slice (e.g. @hash{...})
- Any of the above preceded by my, our or local
There are two differences between the operators.
Context of Operands
The two operators differ in the context in which their operands are evaluated.
- The scalar assignment evaluates both of its operands in scalar context.
- The list assignment evaluates both of its operands in list context.
Value(s) Returned
The two operators differ in what they return.
Returns | Context in which Assignment Operator is Evaluated | ||
---|---|---|---|
scalar | list | ||
Operator | scalar assignment | The LHS as an lvalue | The LHS as an lvalue |
list assignment | The number of scalars returned by the RHS | The scalars returned by the LHS as lvalues |
Note that the right-hand side is used for the list assignment in scalar context.
Examples
Examples | Context in which Assignment Operator is Evaluated | |||
---|---|---|---|---|
scalar | list | |||
Operator | scalar assignment |
|
|
|
list assignment |
|
|
|
Related topics:
Update: Added examples.
Update: Incorporated JavaFan's additions.
Update: Removed list slices and mentioned state.
Update: One of the examples in the scalar context column did not depend on context. It has been moved to its own column. Also, added short explanations of examples.
Update: Reworded to not say there are only two assignment operators, because += and such are also assignment operators.
Update: Reworded to include new fangled []->@* to the list of aggregates.
|
---|