Шаг 9.
Массивы скаляров

    На этом шаге мы введем понятие массива скаляров и проиллюстрируем его использование.

    Массив, в отличие от скалярного типа данных, представляющего единственное значение, - это тип данных, предназначенный для хранения и обработки нескольких скалярных данных, ссылаться на которые можно с помощью индекса. Все массивы 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, - о ассоциативных массивах или хэш-массивах.




Предыдущий шаг Содержание Следующий шаг