Поиск

Получение данных из хэша

Для извлечения индивидуального элемента из хэша нужно набрать символ $, имя хэша и ключ элемента, например:

Этот фрагмент кода распечатывает элемент The Shining хэша %Movies. В результате будет выведено слово Kubrick.

Иногда требуется выполнить проверку всех элементов хэша. Если все ключи хэша известны, можно получить доступ к любому элементу хэша. Но обычно неудобно выполнять общие операции с элементами хэша, явно указывая имена ключей, поскольку все они могут быть неизвестны или их может быть слишком много для перечисления.

Для получения списка ключей хэша используется функция keys. Ключи хэша не упорядочены, поэтому функция keys также возвращает список ключей в неупорядоченном виде. Для вывода всех фильмов из нашего хэша используется следующий код:

В этом примере переменной $film поочередно присваиваются значения всех элементов списка, возвращаемого выражением keys %Movies. Если кроме названий фильмов нужно распечатать имена режиссеров, используйте следующий код:

После выполнения этого кода будут выведены следующие строки:

Так как переменная $film содержит значение ключа хэша, конструкция $Hovies{$film} возвращает значение элемента хэша с этим ключом. Для демонстрации взаимосвязи ключа и значения элемента хэша полезно их распечатать вместе. Однако следует иметь в виду, что ваш результат может отличаться от приведенного в книге порядком следования элементов, поскольку функция keys возвращает ключи в неупорядоченном виде.

Кроме keys, в Perl есть также функция values, предназначенная для доступа к значениям всех элементов хэша. Извлечение значений отдельно от ключей не позволяет узнать, с каким ключом связано каждое конкретное значение. Функция values возвращает значения хэша в том же порядке, что и keys возвращает ключи. Вот пример:

Здесь элементы @Directors и @Filrns с одинаковым индексом образуют пару ключ-значение хэша fcMovies. Имя режиссера в $Directors[0] соответствует названию фильма $Films[0] и т.д.

Часто нужно извлечь индивидуальный элемент хэша не по ключу, а по его значению. Для этого существует специальный метод доступа, называемый инверсией хэша. Он заключается в том, что ключи и значения меняются местами, т.е. все ключи становятся значениями, а все значения становятся ключами:

Как этот код работает? Функция reverse рассматривает хэш как обычный список:

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

Обратите внимание, что внутри пар ключ-значение произошли перестановки — значения теперь находятся впереди. После присвоения получившегося списка хэшу %ByDirector мы получаем хэш, практически идентичный исходному, за исключением того, что значения исходного хэша стали ключами нового, а ключи исходного — значениями нового. Будьте осторожны с подобной операцией, если некоторые элементы исходного хэша имеют одинаковые значения. Если значения, которые становятся ключами, не уникальны, в новом хэше будет меньшее количество элементов, чем в исходном. Как только в новом хэше будет встречаться уже имеющееся значение, старый ключ будет заменяться новым.