Создание хэшей массивов
Проблема
С каждым ключом хэша может быть ассоциирована лишь одна скалярная величина,
однако вам хочется использовать один ключ для хранения и извлечения нескольких величин.
Иначе говоря, вы хотите, чтобы ассоциированное значение представляло собой список.
Решение
Сохраните в элементе хэша ссылку на массив. Используйте
push для присоединения новых элементов:
push( @{ $hash{"KEYNAME"} }, "new value" );
Затем при выводе хэша разыменуйте значение как ссылку на массив:
foreach $string (keys %hash) {
print "$string: @{ $hash{$string} }\n":
}
Комментарий
В хэше могут храниться только скалярные величины. Впрочем, ссылки и являются скалярными
величинами. Они помогают решить проблему сохранения нескольких ассоциированных значений с
одним ключом — в $hash{$key} помещается ссылка на массив, содержащий значения $key.
Все стандартные операции с хэшами (вставка, удаление, перебор и проверка существования)
могут комбинироваться с операциями массивов (
push,
splice и fоreach).
Присвоение ключу нескольких значений осуществляется следующим образом:
$hash{"a key"} = [ 3, 4, 5 ]; # Анонимный массив
Ключ с ассоциированным массивом используется так:
@values = @{ $hash{"a key"} };
Для присоединения новых значений к массиву, ассоциированному с конкретным ключом,
используется функция push:
push @{ $hash{"a key"} }, $value;
Классическое применение этой структуры данных — инвертирование хэша, котором одно
значение ассоциируется с несколькими ключами. В хэше, полученном после инвертирования,
один ключ ассоциирован с несколькими значениям.
Учтите, что запись вида:
$residents = @{ $phone2name{$number} };
при действующей директиве use strict вызовет исключение, поскольку вы пытаетесь разыменовать
неопределенную ссылку без автоматического создания. Приходится использовать другую формулировку:
$residents = exists( $phone2name{$number} ) ? @{ $phone2name{$number} } : ();
См. также
Proverte kod v komentariyah gde pro list tam oshibki detskie
Оставить комментарий:
|
|