print "с ключом $key связано значение $value\n";
}
Иногда требуется искать ключи хэша по их значениям. Для этого нужно создать обратный ассоциативный массив (или инвертированный хэш), поменяв местами значения и ключи хэша. Это можно сделать так:
while (my ($key, $value) = each %hash_by_key) { # ключи хэша
$hash_by_value{$value} = $key; # становятся значениями
}
Этого же результата можно достичь с помощью функции
%hash_by_value = reverse %hash_by_key; # переворот списка
$key = $hash_by_value{$value}; # поиск по бывшему значению
Нечетные элементы инвертированного списка становятся ключами, а четные - значениями хэша
Так как весь хэш, его ключи или значения можно легко преобразовать в список, то для обработки хэшей можно применять любые функции, работающие со списками. Именно поэтому в предыдущем примере была применена функция
{ # организовать блок, где объявить временный массив
my @temp = %hash; # сохранить в нем хэш
print "@temp"; # и передать его функции print
} # по выходе из блока временный массив будет уничтожен
Можно напечатать хэш по-другому, построчно и в более облагороженном виде, при помощи функции map, которая также выполняет роль итератора:
print map {"Ключ: $_ значение: $hash{$_}\n" } keys %hash;
В этом примере на основании списка ключей, возвращенного функцией
В приведенных выше примерах при необходимости обработки ключей хэша в алфавитном порядке они сортировались с помощью функции
foreach $key ( # каждый элемент списка,
sort # отсортированный по порядку
{$hash{$a} cmp $hash{$b}}# значений, ассоциированных
keys %hash) { # с ключами хэша
print "значение:$hash{$key} ключ:$key\n"; # обработать
} # в цикле
Здесь в блоке сравнения функции
Подобно тому, как при работе с массивами срезы позволяют работать со списком элементов, в Perl есть возможность обращаться сразу с несколькими элементами хэша. Это делается с помощью среза хэша. Срез хэша (hash slice) - это список значений хэша, заданный перечнем соответствующих ключей. Он записывается в виде имени хэша с префиксом @ (так как срез - это список), за которым в фигурных скобках перечисляются ключи. Список ключей в срезе хэша можно задать перечислением скалярных значений, переменной-списком или списком, возвращенным функцией. Например, так:
@hash{$key3, $key7, $key1} # срез хэша задан списком ключей
@hash{@key_values} # срез хэша задан массивом
@hash{keys %hash} # то же, что values(%hash)
Если в срезе хэша список ключей состоит из единственного ключа, срез все равно является списком, хотя и из одного значения. Сравните:
@hash{$key} # срез хэша, заданный списком из одного ключа
$hash{$key} # значение элемента хэша, заданное ключом
Поскольку переменная-хэш в составе строки не интерполируется, для вставки в строку всех значений хэша можно воспользоваться срезом хэша:
%hash = ('0' => 'false', '1' => 'true');
Вильям Л Саймон , Вильям Саймон , Наталья Владимировна Макеева , Нора Робертс , Юрий Викторович Щербатых
Зарубежная компьютерная, околокомпьютерная литература / ОС и Сети, интернет / Короткие любовные романы / Психология / Прочая справочная литература / Образование и наука / Книги по IT / Словари и Энциклопедии