Символ =
компилируется в один из двух операторов присваивания:
- A оператор присваивания списка (
aassign
) используется, если левая часть (LHS) из =
является некоторой совокупностью. - A оператор скалярного присваивания (
sassign
) используется в противном случае.
Ниже приведенысчитаются агрегатами:
- Любое выражение в скобках (например,
(...)
) - Массив (например,
@array
) - Срез массива (например,
@array[...]
) - Хеш (например,
%hash
) - Хеш-фрагмент (например,
@hash{...}
) - Любому из вышеперечисленных предшествует
my
, our
или local
Между операторами существуют два различия.
Контекст операндов
Два оператора отличаются в контексте, в котором оцениваются их операнды.
Скалярное назначение оценивает оба его операнда в скалярном контексте.
# @array evaluated in scalar context.
my $count = @array;
Назначение списка оценивает оба его операндав контексте списка.
# @array evaluated in list context.
my @copy = @array;
# @array evaluated in list context.
my ($first) = @array;
Возвращаемые значения
Два оператора отличаются в том, что они возвращают.
Скалярное назначение ...
... в скалярном контексте оценивается как его LHS как lvalue.
# The s/// operates on $copy.
(my $copy = $str) =~ s/\\/\\\\/g;
... в контексте списка оценивается как его LHS как lvalue.
# Prints $x.
print($x = $y);
Назначение списка ...
... в скалярном контексте определяется числом скаляров, возвращаемых его RHS.
# 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;
# $counts gets the number of scalars returns by f().
my $count = () = f();
... в контексте списка оценивает скаляры, возвращаемые его LHS, как lvalues.
# Prints @x.
print(@x = @y);