PERL - статьи

       

Хеши хешей


Хеши, составленные из других хэшей, полезны при работе с текстовой многоуровневой

информационной системой (например, экспертной системой). В этих случаях

текстовые ключи используются для последовательного просмотра различных

уровней структуры данных. В следующем примере такой хэш создается за раз:

%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";

}


Содержание раздела