Создание хэшей массивов

Проблема

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

Решение

Сохраните в элементе хэша ссылку на массив. Используйте 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} } : ();

См. также




2013-09-10 17:05:19

Proverte kod v komentariyah gde pro list tam oshibki detskie




Оставить комментарий:
Ваше Имя:
Email:
Антибот: *  
Ваш комментарий: