Ассоциативные массивы
Рассмотренный нами ранее хеш-массив %т можно инициировать и таким способом:
%т = ( "Имя" › "Ларри", "Фамилия" › "Уолл");
Если бы мы хотели в качестве индексов имени и фамилии использовать английские слова name и surname, то этот же ассоциированный массив можно было бы задать следующим оператором:
%т = ( Name › "Ларри", Surname › "Уолл");
Добавить новый элемент ассоциативного массива или изменить значение существующего очень легко. Достаточно присвоить его элементу, определяемому заданным ключом, значение в операторе присваивания:
$т{"Имя"} = "Гарри"; # Изменили значение существующего элемента. $т{"Телефон"} = "345-56-78"; # Добавили новый элемент.
Если при использовании подобной конструкции ассоциативный массив еще не существовал, то при выполнении операции присваивания сначала будет создан сам массив, а потом присвоится значение его элементу. Ассоциативные массивы, как и массивы скаляров, являются динамическими: все добавляемые элементы автоматически увеличивают их^размерность.
Удалить элемент ассоциативного массива можно только с помощью встроенной функции delete:
delete($m{"Телефон"}); # Удалили элемент с ключом "Телефон".
Совет
При изменении значения элемента ассоциативного массива с помощью ключа следует проверять правильность его задания (отсутствие дополнительных пробелов, регистр букв), так как в случае несоответствия заданного ключа элемента с существующими в хеш-массив просто добавится новый элемент с заданным ключом.
При работе с ассоциативным массивом часто требуется организовать перебор по множеству всех его ключей или значений. В языке существуют две встроенные функции – keys и values, которые представляют в виде списка, соответственно, ключи и значения ассоциативного массива, Следующий фрагмент программы:
print keys(%m), "\n"; # Печать ключей .print values(%m), "\n"; # Печать значений.
…отобразит на экране монитора строку ключей и строку значений массива %т:
Фамилия Имя Телефон Уолл Ларри 345-56-11
Обратите внимание, что они отображаются не в том порядке, как задавались с помощью конструктора массива.
Замечание
При создании элементов ассоциативного массива они сохраняются в памяти в порядке, удобном для их.последующего извлечения. Поэтому при его печати последовательность элементов не соответствует порядку их задания. Для упорядочивания значений хеш-массивов следует воспользоваться встроенной функцией сортировки.
Итак, хеш-массивы позволяют обращаться к своим элементам не с помощью числового индекса, а с помощью индекса, представленного строкой. Но что же здесь такого замечательного, какие возможности предоставляет подобная конструкция? Огромные. И первое, что приходит на ум, – это использовать ключи как аналог ключей реляционных таблиц. Правда, хеш-массивы не позволяют непосредственно хранить запись, а только один элемент, но и этого уже достаточно, чтобы создать достаточно сложные структуры данных (пример 3.7).
#! peri – w %friend = ( "0001", "Александр Иванов", "0002", "Александр Петров", "0003", "Александр Сидоров"); %city = ( "0001", "Санкт-Петербург", "0002", "Рязань", '"0003", "Кострома"); %job = ( "0001", "учитель", "0002", "программист", "0003", "управляющий" );. ' $person = "0001"; print "Мой знакомый $friend{$person}\n"; print "живет в городе $city{$person}\n"; print "и имеет профессию $job{$person}.\п";