There are two assignment operators, the list assignment operator and the scalar assignment operator. If the left-hand side (LHS) of an assignment is some kind of aggregate, the list assignment is used. Otherwise, the scalar assignment is used. The following are considered to be aggregates:
- (...) (any expression in parentheses)
- Any of the above preceded by my, our or local
There are two differences between the operators. The first is the context in which 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.
The second difference is in what they return:
|Returns||Context in which Assignment Operator is Evaluated|
|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.
Finally, here are some examples:
|Examples||Context in which Assignment Operator is Evaluated|
# Array evaluated in scalar context.
my $count = @array;
# The s/// operates on $copy.
(my $copy = $str) =~ s/\\/\\\\/g;
# Prints $x.
print($x = $y);
# Array evaluated in list context.
my @copy = @array;
# Only dies if f() returns an empty list.
# This does not die if f() returns a
# false scalar like zero or undef.
my ($x) = f() or die;
my $count = () = f();
# Prints @x.
print(@x = @y);
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.