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 parens)

@array and @array[...]

%hash and @hash{...}

my (...), our (...) and local (...) (state (...) throws an error.)

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

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.

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.

Went to join the gridlock to see it
Held an eclipse party
Watched a live feed
I cn"t see tge kwubosd to amswr thus
I tried to see it, but 8000 miles of rock got in the way
What eclipse?
Wanted to see it, but they wouldn't reschedule it
Read the book instead