Это примерно context в Perl. Это важный аспект языка.
С выражением типа
my $var = @ary;
вы пытаетесь присвоить массив скаляру.
Это не имеет смысла в том виде, в каком оно есть, и получается, что правая часть вычисляется по количеству элементов массива и , что присваивается $var
.
Чтобы изменить это поведение, вам нужно предоставить «контекст списка» оператору присваивания. В этом случае вы бы сделали
my ($var) = @ary;
и теперь у нас есть присвоение списка (элементов массива) списку (переменных здесь $var
), где им присваивается один за другим. Итак, здесь первый элемент @ary
назначен на $var
. Обратите внимание, что это утверждение не соответствует неуловимому понятию «список».
Итак, в вашем случае вы хотите
my ($ref) = @_;
и первый элемент из @_
назначается на $ref
, если необходимо.
В качестве альтернативы, вы можете удалить и вернуть первый элемент @_
, используя shift , и в этом случае скалярное контекстное присваивание имеет порядок
my $ref = shift @_;
В этом случае вы также можете сделать
my $ref = shift;
, поскольку shift
по умолчанию работает на @_
.
Это подходит, когда вы хотите удалить первый элемент ввода при его назначении, чтобы оставшиеся @_
хорошо подходили для дальнейшей обработки. Это чаще всего полезно в объектно-ориентированном коде.