На этом шаге мы введем понятие массива скаляров и
проиллюстрируем
его использование.
Массив, в отличие от скалярного типа данных, представляющего единственное значение, - это тип данных, предназначенный для хранения и обработки нескольких скалярных данных, ссылаться на которые можно с помощью индекса. Все массивы Perl одномерны, и их можно представлять как некий линейный список скаляров. В программе массив задаётся с помощью специальной синтаксический конструкции языка Perl, называемой конструктором массива. Он представляет собой список скалярных значений, заключенный в круглые скобки. Элементы списка отделяются друг от друга запятыми и представляют элементы массива:
(скаляр_1, скаляр_2, ..., скаляр_n)
Как и в других языках программирования, массив Perl представляет набор однотипных данных - скаляров, но скалярные данные могут быть как числовыми, так и строковыми, поэтому, с точки зрения других языков программирования, в массивах Perl хранятся смешанные данные - числа и строки. В качестве скаляра в конструкторе массива может использоваться числовой или строковый литерал или скалярная переменная, чье значение и будет являться элементом массива:
(5, "умножить на", 4) # Используются только литералы. ($first, 'равно', $second) # Используются значения скалярных переменных.
Индексы массивов в языке Perl начинаются с 0, а отрицательные индексы позволяют обратиться к элементам в обратном их заданию порядке:
(5, "умножить на", 4) [0] # Первый элемент массива: 5. (5, "умножить на", 4) [-1] # Последний элемент массива: 4. (5, "умножить на", 4) [-3] # Первый элемент массива: 5.
В качестве элемента списка в конструкторе массива можно использовать конструктор массива, но мы не получим в этом случае массив массивов, то есть многомерный массив, к элементам которого можно обратиться с помощью нескольких индексов. Дело в том, что если в качестве элемента списка в конструкторе массива используется конструктор массива, то его элементы добавляются к элементам массива, определяемого внешним конструктором, то есть каждый его элемент становится элементом внешнего массива, увеличивая количество его элементов на количество элементов внутреннего массива. Например, массив:
(1, (2, 3), 4)
эквивалентен массиву:
(1, 2, 3, 4)
В программе массивы хранятся в специальных переменных, имена которых начинаются с символа @. Объявление массива чаще всего осуществляется в операторе присваивания (=), в правой части которого обычно задается конструктор массива:
@array = ($ml, '+', $m2, '=', $ml+$m2);
Массивы в Perl являются динамическими. Добавление нового элемента в массив автоматически увеличивает его размер. С помощью индекса можно добавить элемент, отстоящий от последнего определенного элемента массива на любое число элементов, и это действие не приведет к ошибке. Просто все промежуточные элементы будут не определены (их значение будет равно пустой строке). При такой реализации массивов программисту не надо заботиться, как в других языках программирования, что индекс выйдет за пределы массива. В случае обращения к не существующему элементу массива Perl возвращает значение, равное нулевой строке.
Задать или получить значения элементов массива можно с помощью индекса. Однако "операцию" индексирования нельзя применять непосредственно к имени массива, ее следует применять к переменной, полученной путем добавления к имени массива символа скалярной переменной $. Подобное "неудобство" связано с последовательным проведением в Perl использования первого символа переменной для указания ее типа: ведь элемент массива является ничем иным как скаляром. Примеры использования индекса с переменными массива представлены ниже:
$m1[0] = "Первый"; # Задает первый элемент массива @m1. $m1[1] = "Второй"; # Задает второй элемент массива @m1. @m2 = (1, 2, 3, 4, 5); # Задание массива @m2.
В любой момент можно определить число элементов массива. Для этого следует воспользоваться синтаксической конструкцией:
$#имя_массива
которая возвращает максимальный индекс массива или -1, если массив не определен. Чтобы получить количество элементов массива, следует к возвращаемому значению этой конструкции добавить 1, так как индексы массивов в Perl начинаются с 0. В Perl предусмотрена операция диапазон, которую можно использовать в конструкторе массива. Например, чтобы создать массив натуральных чисел до 1000, достаточно одного оператора:
@naturelNumbers = (1..1000);
первое_число..последнее_число
Она определяет набор чисел (целых и вещественных), начинающихся со значения первое_число и не превосходящих последнее_число, в котором последующее больше предыдущего на единицу. Эта операция действительна не только для чисел, но и для алфавитно-цифровых строк, но в этом случае увеличение на единицу означает увеличение на единицу ASCII-кода символа строки. Например:
"a".."c" # Соответствует: "a", "b", "c" "BCY".."BDB" # Соответствует: "BCY", "BCZ", "BDA", "BDB"
Иногда для работы необходимо выделить некоторое подмножество элементов массива, которое мы будем называть фрагментом массива. Можно ее выполнить просто, но не эффективно: присвоить элементам некоторого нового массива значения соответствующих элементов старого, можно воспользоваться специальной конструкцией Perl для выделения фрагмента массива. Если после имени переменной массива в квадратных скобках задать список индексов некоторых элементов массива, то такая конструкция и будет определять фрагмент массива, причем индексы не обязательно должны идти в каком-то определенном порядке - их можно задавать произвольно. Для выделения фрагмента, состоящего из последовательно идущих элементов массива, можно использовать знакомую нам операцию диапазон. Фрагмент массива сам является массивом, и поэтому его можно использовать в правой части оператора присваивания. Несколько примеров создания фрагментов массива приведено ниже:
@m = (10..19); # Исходный массив: # (10, 11, 12, 13, 14, 15, 16, 17, 18, 19). @m[0, 2, 4, 6, 8]; # Фрагмент 1: (10, 12, 14, 16, 18). @m[6, 4, 5, 8, 6]; # Фрагмент 2: (16, 14, 15, 18, 16). @m[2..4]; # Фрагмент 3: (12, 13, 14). @m[8, 2..4, 0]; # Фрагмент 4: (18, 12, 13, 14, 10).
На следующем шаге мы поговорим о совершенно новом типе массивов, появившемся в языке Perl, - о ассоциативных массивах или хэш-массивах.