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


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


Два последних приема представляют собой фокусы, связанные с интерполяци­ей. Интерпретация хэша как списка не позволяет предсказать или управлять по­рядком вывода пар «ключ/значение». Более того, данные в этом случае выводят­ся в виде списка ключей и значений, элементы которого разделяются текущим содержимым переменной $ В отличие от других приемов, вам не удастся вывес­ти каждую пару на новой строке или отделить ключи от значений символом =>.

 Смотри также

Описание переменной $ в perlvar(l); описание функций foreach, map, keys, sort и each в perlfunc(l). Строковая интерполяция рассматривается в рецеп­те 1.10, а перебор хэша — в рецепте 5.4

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

Проблема

Функции keys и each извлекают элементы хэша в довольно странном порядке. Вы хотите получить элементы в порядке вставки.

Решение

Воспользуйтесь модулем Tie::IxHash

use Tie IxHash,

tie %ХЭШ  Tie IxHash ,

# Операции с хэшем %ХЭШ

gkeys = keys %ХЭШ        # Массив @keys отсортирован в порядке вставки

Комментарий

Модуль Tie::IxHash заставляет функции keys, each и values возвращать элементы в порядке занесения в хэш. Это часто избавляет от необходимости заранее обра­батывать ключи хэша какой-нибудь сложной сортировкой или поддерживать отдельный массив, содержащий ключи в порядке их вставки.

Tie- IxHash также представляет объектно-ориен тированный интерфейс к функ­циям splice, push, pop, shift, unshift, keys, values и delete, а также многим другим.

Следующий пример демонстрирует использование keys и each:

# Инициализировать
use Tie IxHash,

tie %food_color, Tie IxHas , $food_color{Banana} = Yellow ,

$food_color{Apple} =  Green

$food_color{Lemon} =  Yellow


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

print  "In insertion order,   the foods are'\n"; foreach $food  (keys %food_color)   { print '     $food\n";

print "Still in insertion order, the foods' colors are:\n" while (( $food, $color ) = each %food_color ) { print '$food is colored $color.\n",




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