Присваивание хешей

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

%new_hash = %old_hash;

В действительности при этом Perl выполняет больше работы, чем видно на первый взгляд. В отличие от языков типа Pascal или C, где такая операция сводилась бы к простому копированию блока памяти, структуры данных Perl более сложные. Следовательно, эта строка кода приказывает Perl раскрутить %old_hash в список пар «ключ/значение», а затем последовательно, пару за парой, присвоить его %new_hash. Впрочем, чаще всего присваивание хешей сопровождается некоторым преобразованием. Например, хеш можно обратить, то есть переставить его элементы в обратном порядке:

%inverse_hash = reverse %any_hash;

Команда берет %any_hash и раскручивает его в список пар «ключ-значение»; образуется список вида (ключ, значение, ключ, значение…). Вызов reverse переставляет элементы списка в обратном порядке: (значение, ключ, значение, ключ…). Теперь ключи стоят там, где раньше были значения, и наоборот. При сохранении результата в %inverse_hash выборка производится по строкам, которые были значениями в %any_hash, – в %inverse_hash они стали ключами.


А в результате выборки мы получаем значение, которое принадлежало в числу ключей %any_hash. Таким образом, выборка по «значению» (которое стало ключом) дает «ключ» (который стал значением). Конечно, обращенный хеш будет нормально работать только в том случае, если значения исходного хеша были уникальными, в противном случае в новом хеше появятся дубликаты ключей, а ключи всегда должны быть уникальными. В подобных ситуациях в Perl используется простое правило: последнее добавление элемента побеждает. Иначе говоря, элементы, добавленные в список позднее, заменяют более ранние элементы. Конечно, мы не знаем, в каком порядке пары «ключ-значение» будут храниться в списке, поэтому невозможно заранее предсказать, какая пара «победит». Этот прием следует использовать только в том случае, если вы знаете, что среди исходных значений нет дубликатов. Но в приводившемся ранее примере с IP-адресами и именами хостов дело обстоит именно так:

%ip_address = reverse %host_name;

Теперь можно одинаково легко осуществлять поиск как по IP-адресу, так и по имени хоста.

Оцените статью: (0 голосов)
0 5 0

Статьи из раздела Perl на эту тему:
Зачем использовать хеш?
Интерполяция элементов хеша
Обращение к элементам хеша
Типичные операции с хешами
Функции keys и values

Вернуться в раздел: Perl / 5. Хеши