Поиск

Примеры структур данных

В следующих разделах будут приведены примеры организации структур данных с помощью массивов и хэшей, которые чаще всего используются при программировании.

Список списков; или двумерный массив

Список списков в Perl часто используется для организации структуры данных, на-зываемой двумерным массивом. Как известно, обычный массив представляет собой линейный список значений, как показано ниже на рисунке.

Двумерный массив напоминает таблицу, содержащую строки и столбцы, в которой каждый элемент адресуется по номеру строки и столбца подобно координатам точки на плоскости. Первым в адресе элемента двумерного массива указывается номер строки (начиная с нуля), а вторым — номер столбца, как показано ниже.

В Perl не предусмотрено такого понятия, как многомерный массив. Зато по-. добную структуру данных легко создать с помощью массива ссылок на массивы. Ниже приведен пример создания массива массивов, элементы которого состоят из литералов.

Посмотрите внимательно на этот фрагмент кода. В нем создается обычный список @list_of_lists, который состоит из ссылок на другие списки. Для доступа к отдельным элементам внутренних массивов (или ячеек двумерного массива) используется следующий фрагмент кода:

Методика определения количества элементов во внешнем списке ничем не отличается от той, которую мы применяли для массивов. Напомним, что речь идет о конструкции $ или об использовании имени массива в скалярном контексте, например:

Чтобы определить количество элементов во вложенных массивах, придется прибегнуть к небольшой хитрости. Конструкция $list_of_lists[ l] возвращает ссылку на вторую строку "двумерного" массива @list_of_lists. Если распечатать это значение, то вы получите нечто типа ARRAY (OOOOO). Поэтому, чтобы элементы массива @list_of_ lists интерпретировались как вложенные массивы, при обращении к ним необходимо использовать знак @, как показано ниже на примере.

Для перебора всех элементов списка списков можно использовать следующий фрагмент кода:

В список списков можно добавлять новые элементы и строки, как показано ниже на примере.

Примеры других структур

В предыдущем разделе была рассмотрена методика создания одной из основных структур Perl — двумерного массива — с помощью списка списков. Поскольку на размеры массивов, скаляров и хэшей в Perl не накладывается какого-либо ограничения, комбинируя их, вы можете создавать структуры данных любой сложности. Ниже перечислено несколько примеров таких структур:

  • список, элементы которого являютсяхэшами;
  • хэш, элементы которого являются списками;
  • хэш, элементы которого являются хэшами;
  • хэши, элементы которых являются списком, а элементы списка являются хэшами, и т.д.

Из-за недостатка места на страницах этой книги мы даже не будем пытаться описать все эти структуры. В электронном справочном руководстве по Perl есть специальный раздел, который называется Perl Data Structure Cookbook. В нем очень подробно описаны все перечисленные выше структуры данных и много других. Правда, язык изложения несколько труден для понимания. Для каждой рассматриваемой структуры в электронной документации приводятся следующие сведения:

  • методика объявления структуры на примере литералов;
  • способы наполнения структуры данными;
  • процесс добавления новых элементов;
  • способы доступа к отдельным элементам структуры;
  • методика перебора всех элементов структуры.

Для отображения раздела Perl Data Structure Cookbook наберите в командной строке

perldoc perldsc.
Отладка программ, использующих ссылки

При отладке программ новички часто путаются со ссылками и не могут понять, на структуру какого вида ссылается конкретная ссылка. Масла в огонь подливает и не совсем прозрачный синтаксис операторов со ссылками. Тем не менее в Perl предусмотрены средства, с помощью которых вы быстро поймете, что происходит в программе.

Для начала попытайтесь просто распечатать значение ссылки. При этом Perl отобразит тип структуры данных, на которую указывает ссылка. Например, оператор

выведет примерно такое сообщение:

Оно означает, что в переменной $mysterpreference хранится ссылка на массив. Кроме массива, возможна ссылка на скаляр (SCALAR), хэш (HASH) и подпрограмму (CODE). Чтобы распечатать содержимое массива, на который указывает переменная $mystery_reference, необходимо интерпретировать эту ссылку как массив. Вот пример:

В отладчике Perl также предусмотрены средства, позволяющие легко определить тип ссылки. Для этого нужно распечатать содержимое переменной-ссылки, как это вы делали при отладке обычных программ. В следующем примере исследуется содержимое переменной-ссыпки $ref.

Очевидно, что переменная $ref указывает на хэш. В отладчике предусмотрена специальная команда х, с помощью которой можно распечатать значение ссылки и элементы той структуры, на которую она указывает:

В данном случае ссылка указывает на хэш, в котором находятся три элемента с ключами 'apple', 'carrot' и 'pear'. Отладчик может также распечатывать и более сложные структуры данных, например списки списков, как показано в следующем примере:

В этом примере переменная $а указывает на массив (ARRAY( 0xb33O0)). В свою очередь элементы этого массива ссыпаются на три других массива— ARRAY(0xle8694), ARRAY(0xlb74cc) и ARRAY(0xle8478). А каждый из вложенных массивов содержит по три элемента.

В модуле Data::Dumper предусмотрена специальная функция для распечатки содержимого ссылок. Этот модуль интересен тем, что выводимая им информация имеет формат, который понимает Perl. Таким образом, вы можете сохранить информацию в файле, а затем загружать ее по мере необходимости. В результате вы получите возможность сохранять значения переменных на диске. Модуль Data::Dumper будет описан на 14-м занятии, "Использование модулей".