Вы уже знаете, как присвоить переменной скалярное значение. Аналогичным образом можно присвоить списочное значение списку из нескольких переменных:
($fred, $barney, $dino) = ("flintstone", "rubble", undef);
Все три переменные в списке слева получают новые значения, как если бы в программе были выполнены три присваивания. Список строится до начала присваивания, что позволяет легко поменять местами значения двух переменных в Perl:
($fred, $barney) = ($barney, $fred); # Значения меняются местами
($betty[0], $betty) = ($betty, $betty[0]);
Но что произойдет, если количество переменных (слева от знака равенства) не совпадет с количеством присваиваемых значений (справа)? При списочном присваивании лишние значения игнорируются – Perl считает, что если бы вы хотели где-то сохранить эти значения, то указали бы, где именно их нужно сохранить. Если же в присваивании участвуют лишние переменные, им присваивается значение undef:
($fred, $barney) = qw< flintstone rubble slate granite >; # Два значения
# проигнорированы
($wilma, $dino) = qw[flintstone]; # $dino присваивается undef
Теперь, когда вы умеете присваивать значения спискам, строковый
массив можно построить всего в одной строке следующего вида:
($rocks[0], $rocks, $rocks, $rocks) = qw/talc mica feldspar quartz/;
Но если речь идет о целом массиве, в Perl предусмотрена более простая запись. Просто поставьте знак @ перед именем массива (без индекса в квадратных скобках после него), чтобы сослаться на весь массив сразу. Эту запись можно прочитать как «все элементы», то есть @rocks означает «все элементы rocks».1 Она может использоваться с обеих сторон оператора присваивания:
@rocks = qw/ bedrock slate lava /;
@tiny = ( ); # Пустой список
@giant = 1..1e5; # Список из 100 000 элементов
@stuff = (@giant, undef, @giant); # Список из 200 001 элемента
$dino = "granite";
@quarry = (@rocks, "crushed rock", @tiny, $dino);
Последнее присваивание заносит в @quarry список из пяти элементов (bedrock, slate, lava, crushed rock, granite), так как массив @tiny добавляет в список нуль элементов. (В частности, он не добавляет в список значение undef, хотя это можно сделать вручную, как в предшествующем примере @stuff.) Следует также заметить, что имя массива заменяется содержащимся в нем списком. Массив не становится элементом списка, потому что массивы могут содержать только скаляры, но не другие массивы. Переменная массива, которой еще не было присвоено значение, содержит пустой список ( ). Подобно тому как новые скалярные переменные изначально содержат undef, массивы всегда изначально содержат пустой список. Стоит заметить, что при копировании массива в другой массив все равно выполняется списочное присваивание. Списки просто хранятся в массивах. Пример:
@copy = @quarry; # Копирование списка из одного массива в другой