Иллюстрированный самоучитель по Perl

Ассоциативные массивы

Рассмотренный нами ранее хеш-массив %т можно инициировать и таким способом:

%т = (
"Имя" › "Ларри",
"Фамилия" › "Уолл");

Если бы мы хотели в качестве индексов имени и фамилии использовать английские слова 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}.\п";
Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.