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


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


Однако у хэшей есть свои преимущества. В Perl хэш является встроенным ти­пом данных. Благодаря применению хэшей многие сложные алгоритмы сводятся к простой выборке значений. Кроме того, хэши предоставляют быстрые и удоб­ные средства для построения индексов и таблиц просмотра. Если для простой скалярной переменной применяется идентификатор типа $, а для массива — @, то для хэшей используется идентификатор %.

Префикс % относится лишь к ссылкам на хэш в целом. Значение ключа пред­ставляет собой скалярную величину, поэтому для него используется символ $ (по


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

аналогии с тем, как для ссылок на отдельный элемент массива используется пре­фикс $). Следовательно, отношение «начальник Ната» должно записываться в виде $boss{"Nat"}.

В обычных массивах используются числовые индексы, но индексы хэшей все­гда являются строковыми. Ассоциированные значения могут быть произвольны­ми скалярными величинами, в том числе ссылками. Используя ссылки в качестве ассоциированных значений, можно создавать хэши для хранения не только строк и чисел, но и массивов, других хэшей или объектов (вернее, ссылок на массивы, хэшп или объекты).

Хэши могут инициализироваться с помощью списков, содержащих пары «ключ/ значение»:

%аде = ( "Nat", 24, "Jules", 25, "Josh",    17 );

Такая запись эквивалентна следующей:

$age{'Nat"} = 24, $age{"Jules"} = 25; $age<"Josh"}    = 17;

Для упрощения инициализации хэшей был создан оператор, оператор =>. В ос­новном он представляет собой более наглядную замену для запятой. Например, возможна следующая инициализация хэша:

%food_color = (

"Apple" => "red",

"Banana" =>     "yellow",

"Lemon" => "yellow",

"Carrot" =>     "orange"
);

(хэш %food_color используется во многих примерах этой главы). Такая инициа­лизация также является примером списковой эквивалентности — в некоторых от­ношениях хэш ведет себя так, словно онявляется списком пар «ключ/значение». Мы воспользуемся этим в нескольких рецептах, в частности — для объединения и инвертирования.




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