Следует помнить, что если размер хэша велик, то и полученный с помощью функции
if (keys %hash) { # если scalar(keys(%hash)) != 0
# обработать элементы хэша, если он не пуст
}
Пустой хэш в скалярном контексте возвращает ложное значение (строку '0'), а непустой - истинное. Поэтому проверить, пуст ли хэш, можно еще проще - употребив имя хэша в скалярном контексте, что часто используется в конструкциях, проверяющих условие:
while (%hash) { # или scalar(%hash) != 0 (не пуст ли хэш?)
# обработать элементы хэша
}
Встроенная функция
@hash_values = values %hash; # сохранить все значения хэша
print "$_\n" foreach (values %hash); # вывести значения
В скалярном контексте функция
$hash_size = values %hash; # число значений в хэше
Функция
($key, $value) = each %hash; # взять очередную пару элементов
После того как будет возвращена последняя пара элементов хэша, функция
while (my ($key, $value) = each %hash) { # пока есть пары
# обработать очередные ключ и значение хэша
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;
Вильям Л Саймон , Вильям Саймон , Наталья Владимировна Макеева , Нора Робертс , Юрий Викторович Щербатых
Зарубежная компьютерная, околокомпьютерная литература / ОС и Сети, интернет / Короткие любовные романы / Психология / Прочая справочная литература / Образование и наука / Книги по IT / Словари и Энциклопедии