Вы создаете одноэлементный массив, состоящий из ссылки на массив.
Сколько скаляров вы назначаете массиву, это количество элементов в массиве.
my @a = 4;
# my @a;
# $a[0] = 4;
my @a = 4..6;
# my @a;
# $a[0] = 4;
# $a[1] = 5;
# $a[2] = 6;
[4, 5, 6]
создает один скаляр (ссылку на массив), поэтому my @nonRef = [4, 5, 6];
создает массив который содержит одно значение (ссылку).
my @nonRef = [4, 5, 6];
# my @nonRef;
# $nonRef[0] = [4, 5, 6];
Обратите внимание на полное отсутствие скобок в приведенных выше примерах. Родители не создают никаких значений / переменных, как это делают []
и {}
. Они просто отменяют приоритет, как в математике. Они ни в коем случае не нужны в правой части присваивания массиву. Единственная причина, по которой мы обычно видим их в правой части назначений, заключается в том, что
my @a = 4, 5, 6;
эквивалентно
( my @a = 4 ), 5, 6; # Only assigns 4 to the array.
Для субмарины без прототипов
f(@a)
совпадает с
f($a[0], $a[1], ...)
Итак, когда вы сделали
print(Dumper(@nonRef));
, это как если бы вы сделали
print(Dumper($nonRef[0]));
Я предпочитаю использовать
print(Dumper(\@nonRef));