$array_size = @months; # число элементов (размер) массива
$array_size = scalar @months; # размер массива
В зависимости от контекста, системная функция localtime возвращает разные значения: в скалярном контексте она вернет строку с текущей датой и временем, а в списочном - список из девяти значений с данными о дате и времени:
$date_and_time = localtime;
($sec, $min, $hour, # секунды, минуты, часы
$mday, $mon, $year, # день, месяц, год,
$wday, $yday, $isdst) # день недели, день года, часовая зона
= localtime;
В состав списочного литерала могут входить массивы и другие списочные литералы - тогда они заменяются списком своих значений. Но результирующий массив будет одномерным, так как вложенные списки в Perl не предусмотрены. Массивы массивов организуются с помощью ссылок, что будет изучено в лекции 11 . Вот примеры такой инициализации массива:
@small = (3, 4, 5); # этот массив будет вставлен в список
@big = (1, 2, @small, 6 .. 9); # то же, что @big = (1 .. 9);
@big = ((1, 2), (3 .. 5), (6 .. 9)); # то же, что и выше
С помощью списка можно легко добавить новые элементы в начало или в конец существующего массива:
@array = ($new_element, @array); # добавить элемент в начало
@array = (@array, $new_element); # добавить элемент в конец
@all = (@first, @second); # объединить два массива в один
Присваивая массив списочному литералу, можно извлечь начальные элементы из массива в скалярные переменные, поместив оставшиеся элементы в исходный массив:
($element1, @array) = @array; # извлечь элемент из начала
Массив в левой части присваивания имеет смысл ставить только в конце списка, поскольку он поглощает все значения, и стоящие после него переменные получат неопределенные значения:
(@array,$a,$b) = (1,2,3,4,5); # все 5 чисел попадут в @array
Элементы массива - это скалярные величины, доступ к которым происходит по их порядковому номеру (индексу). Поскольку элемент массива - это скаляр, то его обозначение состоит из разыменовывающего префикса $ перед именем массива, за которым в квадратных скобках стоит индекс. Индексы элементов массива задаются целыми числами, начиная с нуля. (Номер начального индекса массивов раньше мог задаваться значением специальной переменной $[, но сейчас эта возможность считается устаревшей, поэтому поступать так не рекомендуется.) Вот так выглядит в программе обращение к элементам массива:
@array # переменная-массив, хранящая список
$array[0] # первый элемент массива с индексом 0
$array[1] # второй элемент массива с индексом 1
$array[$i] # i-й элемент массива, считая с 0
$array # скаляр, не имеющий отношения к массиву @array
Если требуется обращаться к элементам массива, начиная с последнего, то используются отрицательные значения индексов:
$array[-1] # последний элемент, то есть 1-й от конца
$array[-2] # предпоследний элемент, то есть 2-й от конца
$array[-$n] # n-й элемент массива, считая с конца
Индекс последнего элемента массива, который всегда на единицу меньше размера массива, можно узнать, указав специальный префикс $# перед именем массива:
$last_index = $#array; # индекс последнего элемента @array
Так, например, можно выбрать элемент массива с помощью встроенного генератора случайных чисел rand , который возвращает дробное число от 0 до числа, указанного ему в качестве аргумента. Ограничим случайные числа номером последнего индекса в массиве и будем округлять их до целых значений функцией int:
$random_element = $array[int(rand($#array))];
В $#array можно присвоить новое значение последнего индекса, при этом размер массива изменится. Но такое действие обычно не требуется, так как массив при необходимости увеличивается автоматически. Размер массива в Perl не ограничивается, то есть массив может занимать всю отведенную программе память.
В операции присваивания отдельные элементы массива рассматриваются как обычные скаляры. Ниже приведены примеры, по-разному выполняющие одно и то же присваивание элементам массива:
$birthday[0] = 18; $birthday[1] = 12; $birthday[2] = 1987;
($birthday[0], $birthday[1], $birthday[2]) = (18, 12, 1987);
(Хотя более естественно для подобного присваивания воспользоваться срезом массива: @birthday[0, 1, 2] = (18, 12, 1987) , но о срезах пойдет речь чуть позже в этой лекции.)
Если попытаться присвоить значение элементу с индексом больше текущего размера массива, массив автоматически увеличивается до необходимой длины, а добавленные элементы получают неопределенное значение:
$birthday[5] = 'Perl'; # размер @birthday теперь 5
Читать дальше