Списки в Perl не являются структурами данных, это позиции в исходном коде, определяемые контекстом вокруг них. Списки - это в основном временные структуры, которые Perl использует для перемещения данных. Вы взаимодействуете с ними со всем синтаксисом Perl, но не можете работать с ними как с типом данных. Наиболее близким к списку типом данных является массив.
my @var = (1, 2, 3); # parens needed for precedence, they do not create a list
^ an array ^ a list
say 1, 2, 3;
^ a list
say @var;
^ a list (of one array, which will expand into 3 values before `say` is called)
Когда вы пишете [1, 2, 3]
, вы создаете ссылку на скалярный массив. Эта ссылка на массив инициализируется списком 1, 2, 3
, и это то же самое, что создание именованного массива и получение ссылки на него:
[1, 2, 3] ~~ do {my @x = (1, 2, 3); \@x}
Поскольку конструкция [...]
создает скаляр, вы должны держать его в скаляре:
my $array = [1, 2, 3];
for my $elem (@$array) { # lexical loop variable
print $elem."\n";
}
Поскольку вы хотите работать со всем массивом, а не только со ссылкой, вы помещаете @
перед $array
, который разыменовывает ссылку на сохраненный массив.