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


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


print    @{$foods_with_color{yellow}}  were yellowfoods.n', Banana   Lemon   were   yellow   foods.

Кроме того, это позволит модифицировать программу foodfind так, чтобы она работала с цветами, соответствующими сразу нескольким продуктам. Например, при вызове foodfmd  yellow будут выводиться и Banana, и Lemon.

Если какие-либо значения исходного хэша были не простыми строками и числами, а ссылками, при инвертировании возникает проблема — ссылки не мо­гут использоваться в качестве ключей, если только вы не воспользуетесь модулем Tie::RefHash (см. рецепт 5.12).

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

Описание функций reverse в perlfunc{\); рецепт 13.15.

5.9. Сортировка хэша

Проблема

Требуется работать с элементами хэша в определенном порядке.

Решение

Воспользуйтесь функцией keys для построения списка ключей, а затем отсорти­руйте их в нужном порядке:


166   Глава 5 • Хэши

# %hash - сортируемый хэш

@keys = sort  { criterionO }  (keys %hash),

foreach $key (@keys)  { lvalue = $hash{$key}, # Сделать что-то с $key,   Svalue

Комментарий

Хотя хранить элементы хэша в заданном порядке невозможно (без использования модуля Tie:IxHash, упомянутого в рецепте 5.6), перебирать их можно в любом по­рядке.

Существует множество разновидностей одного базового механизма: вы извле­каете ключи, упорядочиваете их функцией sort и обрабатываете элементы в но­вом порядке. Допускается применение любых хитростей сортировки, упоминав­шихся в главе 4 «Массивы». Рассмотрим пару практических примеров.

В первом фрагменте sort просто используется для упорядочения ключей по алфавиту:

foreach $food (sort keys %food_color) {

print $food is $food_color($food) \n , }

Другой фрагмент сортирует ключи по ассоциированным значениям:

foreach $food (sort { $food_color{$a} cmp $food_color{$b} } ) keys %food__color) {

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

Наконец, сортировка выполняется по длине ассоциированных значений:




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