${$ref2hash}{'ключ'} = 'значение'; # изменение значения
print $$ref2hash{'ключ'}; # доступ к значению элемента хэша
В другой форме разыменования ссылки к переменной, содержащей ссылку на хэш, применяется операция "стрелка", после которой в фигурных скобках указывается ключ элемента хэша. Вот так:
$ref2hash->{'термин'} = 'определение'; # добавим элемент
$value = $ref2hash->{'Хэш'}; # найдем значение по ключу
Если ссылка используется как ключ хэша, она, как и любой ключ хэша, автоматически преобразуется в строку. Такие строки невозможно применять для доступа к объектам ссылки, но они могут служить отличными уникальными ключами хэша, поскольку строковое значение ссылки содержит адрес объекта в памяти, например, 'SCALAR(0x335b04)' или 'ARRAY(0x334dd8)'. Если все-таки требуется использовать ссылки в качестве ключей хэша, то можно воспользоваться модулем
Аналогично созданию "массива массивов" создаются и другие разновидности ссылочных структур данных: массивы хэшей, хэши массивов и хэши хэшей. Ссылочные структуры применяются для структурированного представления взаимосвязанных данных. Для хранения в каждом элементе массива нескольких значений применяется массив хэшей (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 чаще всего представляются в виде хэшей, в которых ключи используются в качестве имен полей и применяются для доступа к значениям полей записи. Для завершающего примера создадим набор записей с информацией о людях. Каждая запись будет анонимным хэшем, а ссылки на записи будут храниться в массиве. В каждой записи дату рождения представим в виде анонимного массива, содержащего год, месяц и день. Вот таким образом:
Вильям Л Саймон , Вильям Саймон , Наталья Владимировна Макеева , Нора Робертс , Юрий Викторович Щербатых
Зарубежная компьютерная, околокомпьютерная литература / ОС и Сети, интернет / Короткие любовные романы / Психология / Прочая справочная литература / Образование и наука / Книги по IT / Словари и Энциклопедии