PERL: БИБЛИОТЕКА ПРОГРАММИСТА


PERL: БИБЛИОТЕКА ПРОГРАММИСТА - стр. 158


Функция exists может иметь два значения: «Существует ли в хэше хотя бы одно значение для данного ключа?» и «Существует ли данное значение для дан­ного ключа?» Чтобы реализовать вторую интерпретацию, придется просмотреть массив в поисках нужной величины. Первая трактовка exists косвенно связана с функцией delete: если мы можем гарантировать, что ни один анонимный массив никогда не остается пустым, можно воспользоваться встроенной функцией exists. Чтобы убедиться, что анонимные массивы не остаются пустыми, их следует про­верять после удаления элемента:

sub multihash_delete  {

my {$hash,   $key,   Svalue) = @_, my $1;

return unless  ref( $hash->{$key}  ); for ($1 = 0,   $i < <®{ $hash->{$key}  };  $i++)  { if ($hash->{$key}->[$i] eq $value)  { splice( @{$hash->{$key}},   $i,   1), last,

delete $hash->{$key}  unless @{$hash-><$key}}, }

Альтернативная реализация многозначных хэшей приведена в главе 13 «Клас­сы, объекты и связи», где они реализуются как связанные обычные хэши.

> Смотри также---------------------------------------------------------------------------------------------

Описание функций splice, delete, push, foreach и exists вperlfunc(l); рецепт 11.1. Связи рассматриваются в рецепте 13.15.


164   Глава 5 • Хэши

5.8. Инвертирование хэша

Проблема

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

Решение

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

# %ХЭШ связывает ключи со значениями
%ОБРАТНЫЙ = reverse %ХЭШ;

Комментарий

В этом решении используется списковая эквивалентность хэшей, о которой упоми­налось во введении. В списковом контексте reve rse интерпретирует %ХЭШ как спи­сок и меняет местами составляющие его элементов. Одно из важнейших свойств списковой интерпретации хэша заключается в том, что элементы списка представ­ляют собой пары «ключ/значение». После инвертирования такого списка первым элементом становится значение, а вторым — ключ. Если интерпретировать такой список как хэш, его значения будут являться ключами исходного хэша, и наоборот. Приведем пример:




- Начало -  - Назад -  - Вперед -