Хеши хешей
Хеши, составленные из других хэшей, полезны при работе с текстовой многоуровневой
информационной системой (например, экспертной системой). В этих случаях
текстовые ключи используются для последовательного просмотра различных
уровней структуры данных. В следующем примере такой хэш создается за раз:
%hash = (
fruits => {
favorite => "apples",
'second favorite' => "oranges"
},
vegetables => {
favorite => "corn",
'second favorite' => "peas",
'last favorite' => "turnip"
},
meat => {
favorite => "chiken",
'second favorite' => "beef"
}
);
print $hahs{fruits}{favorite};
Обратите внимание, что в таком хэше значениями для пар ключ/значение
высупают другие хэши(точнее, ссылки на них).
Кроме того, для конструкций типа {...}{...},
между парами фигурных скобок неявно подставляется оператор-стрелка
-> - разыменования ссылок,
Создание хэша хэшей на лету:
Чтобы создать хэш хэшей элемент за элементом, используется та же схема, что и
в случае массива массивов, но с одним существенным отличием к хэшу всегда
можно добавить новые ключ и значение, но добавление к массиву новых элементов
с пропусками индексов порождает неопределенные значения. Пример:
%hash{fruits} = {favorite => "apples",
'second favorite' => "oranges"};
%hash{vegetables} = {favorite => "corn",
'second favorite' => "peas",
'least favorite' => "turnip"};
%hash{meat} = {favorite => "chicken",
'second favorite' => "beef"};
print $hash{fruits}{favorite};
В следующей схеме генератор анонимного хэша комбинируется со списком ключ/значение,
возвращаемым внешней подпрограммой:
for $key ("hash1", "hash2", "hash3")
{ $hash{$key} = {$returnlist}; }
sub returnlist{
return (key1 => valuel, key2 => value2);
}
print $hash{hash1}{key2};
Доступ к элеметнам хеша хешей
Чтобы получить отдельное значение, хранящееся в хэше хэшей, надо явно указать набор
последовательных ключей:
%hash = (
fruits => {favorite => "apples",
'second favorite' => "oranges"},
vegetables => {favorite => "corn",
"second favorite' => "peas",
"least favorite' => "turnip"}
);
print $hash{fruits}{"second favorite'};
Используя стандартные приемы работы с обычными хэшами, можно
организовать цикл по элементам хэша хэшей:
%hash = (
fruits => {favorite => "apples",
'second favorite' => "oranges"},
vegetables => {favorite => "corn",
"second favorite' => "peas"}
);
for $food (keys %hash) {
print "$food:\n\t {";
for $key (keys %{$hash{$food}}) {
print "'$key1' => \"$hash{$food}{$key}\",";
}
print "}\n";
}
Чтобы сортировать записи хэш-таблицы по ключам, в заголовок цикла можно
включить операцию сортировки:
%hash = (
fruits => {favorite => "apples",
second => "oranges"},
vegetables => {favorite => "corn",
second => "peas"}
);
for $food (keys %hash) {
print "$food:\n\t {";
for $key (keys %{$hash{$food}}) {
print "'$key1' => \"$hash{$food}{$key}\",";
}
print "}\n";
}