PERL: БИБЛИОТЕКА ПРОГРАММИСТА


PERL: БИБЛИОТЕКА ПРОГРАММИСТА - стр. 157


In insertion order, the foods are:

Banana

Apple

Lemon

Still in insertion order, the foods' colors are: Banana is colored Yellow. Apple is colored Green. Lemon is colored Yellow.

t> Смотри также

Документация по модулю Tie::IxHash от CPAN; рецепт 13.15.

5.7. Хэши с несколькими ассоциированными значениями

Проблема

Требуется хранить в хэше несколько значений, ассоциированных с одним ключом.

Решение

Сохраните в хэше ссылку на массив для хранения ассоциированных значений.

Комментарий

В хэше могут храниться только скалярные величины. Однако ссылки являются ска­лярными величинами. Таким образом, проблема решается сохранением в $ХЭШ {$КЛЮЧ} ссылки на массив со значениями, ассоциированными с ключом $КЛЮЧ. Обычные операции с хэшами — вставка, удаление, перебор и проверка существования — пе­реписываются для операций с массивами (push, splice и foreach).

Следующий фрагмент реализует простую вставку в хэш. Он обрабатывает вы­ходные данные команды who(l) на компьютере с UNIX и выводит краткий спи­сок пользователей с терминалами, на которых они зарегистрированы:

%ttys =();

open(WHO, "who|")        or die "can't open who: $!' ; while (<WHO>) {

($user, $tty) = split,

push( @{$ttys{$user}}, $tty ),


5.7. Хэши с несколькими ассоциированными значениями   163

foreach $user  (sort  keys %ttys)  {

print  "$user  @t$ttys{$user}}\n", >

Вся суть этого фрагмента заключена в строке push, где содержится версия $tty{$user} = $tty для многозначного хэша. Все имена терминалов интерполиру­ются в строке print конструкцией @{$ttys{user}}. Если бы, например, нам потре­бовалось вывести владельца каждого терминала, мы бы организовали перебор анонимного массива:

foreach $user (sort keys %ttys)  {

print "$user.   ",   scalar( @{$ttys{$user}}  ),   'ttys \n"; foreach $tty (sort @{$ttys{$user}})  {

@stat = state/dev/$tty' );

$user = @stat ">  (  getpwuid($stat[4])  )[0]   .     (not available)',

print  "\t$tty (owned by $user)\n ;




- Начало -  - Назад -  - Вперед -