Опубликован: 17.08.2006 | Уровень: для всех | Доступ: платный
Лекция 11:

Ссылки

Ссылочные структуры данных

Аналогично созданию "массива массивов" создаются и другие разновидности ссылочных структур данных: массивы хэшей, хэши массивов и хэши хэшей. Ссылочные структуры применяются для структурированного представления взаимосвязанных данных. Для хранения в каждом элементе массива нескольких значений применяется массив хэшей (Array of Hashes, AoH). Вот пример массива, содержащий ссылки на анонимные хэши, в каждом из которых хранятся сведения о каком-либо объекте:

my $AoH = [ # этапы "Формулы-1" '2006 года
  {grandprix=>'Бахрейна', date=>'2006.03.12'},
  {grandprix=>'Малайзии', date=>'2006.03.19'},
  {grandprix=>'Австралии', date=>'2006.04.02'},
  {grandprix=>'Сан-Марино', date=>'2006.04.23'},
  # и так далее...
  ];
  # напечатать хэш, на который ссылается 4-й элемент массива
  print "Гран-при $AoH->[3]->{grandprix} $AoH->[3]->{date}";
  # выведет: Гран-при Сан-Марино 2006.04.23

Для того чтобы ассоциировать с каждым ключом хэша список скалярных значений, применяется хэш массивов (Нash of Аrrays, HoA). Приведем пример хэша массивов, где в каждом элементе хэша хранится ссылка на анонимный список ассоциированных значений:

my $HoA = { # годы создания языков программирования
	1964 => ['SIMULA', 'BASIC', 'PL/1'],
	1970 => ['Forth', 'Pascal', 'Prolog'],
	1979 => ['Ada', 'Modula-2'],
	1987 => ['Perl', 'Haskell', 'Oberon'],
	1991 => ['Python', 'Visual Basic']
};
# напечатать список, ассоциированный с 1987 годом
foreach my $language (sort @{$HoA->{1987}}) {
   print "$language "; 
} # выведет: Haskell Oberon Perl

Элементы хэша также могут хранить ссылки на другие хэши, образуя хэш хэшей (Нash of Нashes, HoH). Вот пример описания хэша хэшей, где с каждым поисковым ключом ассоциируется анонимный хэш с информацией об объекте:

my $HoH = { # авторы и годы создания языков программирования
	'Pascal' => {author=>'Niklaus Wirth', year=>1970},
	'Perl' => {year=>1987, author=>'Larry Wall'},
	'C' => {author=>'Dennis Ritchie', year=>1972}	
};
# в каком году был создан Pascal?
print $HoH->{'Pascal'}->{'year'}; # выведет: 1970
# кто создал язык Си?
print $HoH->{'C'}->{'author'}; # выведет: Dennis Ritchie

Имеющиеся в других языках программирования записи (record) или структуры (struct), в Perl чаще всего представляются в виде хэшей, в которых ключи используются в качестве имен полей и применяются для доступа к значениям полей записи. Для завершающего примера создадим набор записей с информацией о людях. Каждая запись будет анонимным хэшем, а ссылки на записи будут храниться в массиве. В каждой записи дату рождения представим в виде анонимного массива, содержащего год, месяц и день. Вот таким образом:

my $family = [ # массив записей о семье 
   {name => 'Михаил', birthday => [1958, 11, 12]},
   {name => 'Ирина', birthday => [1955, 03, 23]},
   {name => 'Маша', birthday => [1980, 07, 27]},
   {name => 'Миша', birthday => [1981, 11, 28]},
   {name => 'Лев', birthday => [1988, 06, 24]}
];
# напечатаем год рождения Маши:
print "$family->[2]->{birthday}->[0]"; # или проще:
print "$family->[2]{birthday}[0]"; # выведет: 1980

Подобные структуры легко динамически модифицировать при выполнении программы. Например, добавим в каждую запись новое поле - 'address', в котором сохраним ссылку на запись о месте проживания человека. Адрес оформим в виде анонимного хэша из нескольких полей:

# адрес в виде анонимного хэша, в $address - ссылка на него:
$address = {country => 'Россия', index => 641870}; # и т.д.

# добавить поле адреса и поместить туда $address:
foreach my $person (@{$family}) { # пропишем всех
   $person->{address} = $address; # по одному адресу
}
# выведем почтовый индекс для Ирины
print "$family->[1]->{address}->{index}\n"; # 641870

На рис. 11.5 приведена ссылочная структура данных, которая получилась в результате выполнения программы. Для доступа по ссылкам ко всем элементам этой структуры используется единственная именованная переменная $family.

Пример ссылочной структуры данных

Рис. 11.5. Пример ссылочной структуры данных

С помощью ссылок создаются и другие динамические структуры данных: связные списки, деревья и графы. Подытоживая все сказанное о ссылках, в таблице 11.1 приводится сводная информация о синтаксических конструкциях при работе со ссылками.

Таблица 11.1. Синтаксические конструкции для работы со ссылками на данные
Скаляр Массив Хэш
Взятие ссылки на объект $sref = \$scalar; $aref = \@array; $href = \%hash;
Создание ссылки на анонимный объект $sref = \'Литерал'; $aref = [$a, $b]; $href = {$a => $b};
Доступ к значению объекта ссылки ${$sref} $$sref @{$aref} @$aref %{$href} %$href
Доступ к значению элемента объекта ссылки $aref-> [$index] ${$aref}[$index] $href->{$key} ${$href}{$key}
Доступ к срезу объекта ссылки @{$aref}[$i1, $i2] @{$href}{$k1, $k2}
Значение функции ref($ref) для объекта ссылки SCALAR ARRAY HASH
Сергей Крупко
Сергей Крупко

Добрый день.

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

 

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

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

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

 

Мария Кравцова
Мария Кравцова
Россия, Сочи, РГПУ им. А.И.Герцена, 1997
Екатерина Архангельская
Екатерина Архангельская
Россия, СПбГУАП