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


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


@foods = sort { length($food_color{$a}) <=> length($food_color{$b}) }

keys %food_color, foreach $food (@foods) {

print $food is $food_color{$food} \n , }

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

Описание функций sort и keys вperlfunc(l); рецепт 5.6. Сортировка списков рассматривается в рецепте 4.15.

5.10. Объединение хэшей

Проблема

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

Решение

Интерпретируйте хэши как списки и объедините их так, как это делается со списками:


5.10. Объединение хэшей   167

%merged =

Для экономии памяти можно организовать перебор элементов и построить новый хэш следующим образом:

%merged = (),

while (  ($k,$v) = each(%A)  )  { $merged{$k} = $v,

}

while (  ($k,$v) = each(%B)  )  { $merged{$k}  = $v,

Комментарий

В первом варианте, как и в предыдущем рецепте инвертирования хэшей, использу­ется списковая эквивалентность, о которой говорилось во введении. (%А,  %В) ин­терпретируется как список пар «ключ/значение». Когда он присваивается объе­диненному хэшу %merged, Perl преобразует список пар снова в хэш. Рассмотрим, как эта методика реализуется на практике:

#  Хэш %food_color определяется во Введении
%drink_color = ( Galliano    =>    yellow ,

Mai Tai    =>    blue    ),

%mgested_colors =  (%drink_color    %food_color),

Ключи обоих входных хэшей присутствуют в выходном не более одного раза. Если в хэшах найдутся совпадающие ключи, в итоговый хэш включается тот ключ, который встретился последним.

Прямое присваивание компактно и наглядно, но при больших размерах хэшей оно приводит к большим расходам памяти. Это связано с тем, что перед выпол­нением присваивания итоговому хэшу Perl разворачивает оба хэша во времен­ный список. Пошаговое объединение с помощью each, показанное ниже, избавит вас от этих затрат. Заодно вы сможете решить, как поступать с совпадающими ключами.

С применением each первый фрагмент записывается следующим образом:




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