Опубликован: 17.08.2006 | Доступ: свободный | Студентов: 5371 / 696 | Оценка: 4.49 / 3.94 | Длительность: 20:58:00
ISBN: 978-5-9556-0078-9
Лекция 5:

Списки и массивы

< Лекция 4 || Лекция 5: 12345 || Лекция 6 >

Массивы

Значение списка может храниться в переменной, называемой массив. Перед именем переменной-массива стоит разыменовывающий префикс @ (напоминающий своим видом, что это array - "массив"). Одновременно с переменной-массивом в программе может существовать скалярная переменная с таким же именем, но с префиксом $, так как имена скаляров и массивов хранятся в разных таблицах имен (symbol tables).

@variable		# массив для хранения списка 
$variable		# скаляр для хранения строки или числа

Списочное значение помещается в массив с помощью операции присваивания. Присваивание выполняется по-разному в зависимости от контекста, который определяется левым операндом присваивания. Если в левой части присваивания стоит массив или список, то и в правой части ожидается список. Например:

@empty = (); # пустой массив после присвоения пустого списка
@months = (1 .. 12); # массив со списком номеров месяцев 
@days = qw(Пн Вт Ср Чт Пт Сб Вс); # массив дней недели
@week = @days; # копирование значения массива @days в @week
@array = 25; # литерал 25 рассматривается как список (25)
($first) = @array; # в $first скопируется 1-й элемент массива
@first = @second = (1, 2, 3); # каскадное присваивание

Если в левой части присваивания стоит скалярная переменная, то устанавливается скалярный контекст и в правой части операции ожидается скалярное значение. Например, если попытаться присвоить скалярной переменной массив, то ее значением станет размер массива. Того же результата можно добиться, явно задав для массива скалярный контекст встроенной функцией scalar:

$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
< Лекция 4 || Лекция 5: 12345 || Лекция 6 >
Сергей Крупко
Сергей Крупко

Добрый день.

Я сейчас прохожу курс  повышения квалификации  - "Профессиональное веб-программирование". Мне нужно получить диплом по этому курсу. Я так полагаю нужно его оплатить чтобы получить диплом о повышении квалификации. Как мне оплатить этот курс?

 

Галина Башкирова
Галина Башкирова

Здравствуйте, недавно закончила курс по проф веб программиованию, мне прислали методические указания с примерами тем, однако темы там для специальности 

Системный администратор информационно-коммуникационных» систем.
Мне нужно самой найти тему? или делать по высланным темам