Списочное присваивание

Вы уже знаете, как присвоить переменной скалярное значение. Аналогичным образом можно присвоить списочное значение списку из нескольких переменных:

($fred, $barney, $dino) = ("flintstone", "rubble", undef);

Все три переменные в списке слева получают новые значения, как если бы в программе были выполнены три присваивания. Список строится до начала присваивания, что позволяет легко поменять местами значения двух переменных в Perl:

($fred, $barney) = ($barney, $fred); # Значения меняются местами
($betty[0], $betty[1]) = ($betty[1], $betty[0]);

Но что произойдет, если количество переменных (слева от знака равенства) не совпадет с количеством присваиваемых значений (справа)? При списочном присваивании лишние значения игнорируются – Perl считает, что если бы вы хотели где-то сохранить эти значения, то указали бы, где именно их нужно сохранить. Если же в присваивании участвуют лишние переменные, им присваивается значение undef:

($fred, $barney) = qw< flintstone rubble slate granite >; # Два значения
# проигнорированы
($wilma, $dino) = qw[flintstone]; # $dino присваивается undef

Теперь, когда вы умеете присваивать значения спискам, строковый
массив можно построить всего в одной строке следующего вида:

($rocks[0], $rocks[1], $rocks[2], $rocks[3]) = 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; # Копирование списка из одного массива в другой

Оцените статью: (0 голосов)
0 5 0

Статьи из раздела Perl на эту тему:
в списочном контексте
Главная служебная переменная: $_
Интерполяция массивов в строках
Использование выражений, создающих скаляры, в списочном контексте
Использование выражений, создающих списки, в скалярном контексте

Вернуться в раздел: Perl / 2. Списки и массивы