На этом шаге мы введем понятие хэш-массива и
проиллюстрируем
его использование.
Ассоциативные массивы, называемые также хэш-массивами или просто хэшами позволяют легко создавать динамические структуры данных - списки и деревья разных видов, с помощью которых можно реализовать функциональность простой системы управления базой данных. Подобной конструкции не найти ни в одном современном языке программирования.
Ассоциативные массивы отличаются от массивов скаляров тем, что в них для ссылки на элементы используются строки, а не числовые индексы, то есть концептуально они представляют собой список не просто значений элементов массива, а последовательность ассоциированных пар ключ/значение. Ключ является строковым литералом, и именно он и используется для доступа к ассоциированному с ним значению массива. В программе хеши задаются аналогично массивам скаляров с помощью конструктора, представляющего собой список, заключенный в круглые скобки, в котором пары ключ/значение следуют друг за другом:
(ключ_1, значение_1, ключ_2, значение_2, ..., ключ_n, значение_n)
Для хранения ассоциированных массивов, как и для других элементов данных, используются переменные, первым символом которых является символ процента %. Переменные, в которых хранятся ассоциативные массивы, часто называют хэш-переменными. Ассоциативный массив создается во время операции присвоения такой переменной списка значений:
%m = ("Имя", "Ларри", "Фамилия", "Уолл");
В ассоциативном массиве %m ключами являются строки "Имя" и "Фамилия", а ассоциированными с ними значениями, соответственно, "Ларри" и "Уолл". Теперь, чтобы получить значение, соответствующее какому-либо ключу, следует воспользоваться конструкцией:
$m{"ключ"}
При работе с элементом ассоциативного массива, символ хэш-переменной "%" заменяется на символ скалярной переменной "$". Аналогично поступают и при ссылке на элемент массива скаляров. Единственное отличие - ключ задается в фигурных скобках. Итак, чтобы, например, присвоить некоторой скалярной переменной значение элемента хэш-массива %m, следует воспользоваться следующим оператором:
$surname = $m{"Фамилия"};
Таким образом, хэш-массивы позволяют обращаться к своим элементам не с помощью числового индекса, а с помощью индекса, представленного строкой.
Приведем пример использования хэш-массивов.
%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}.\n";
В этом примере создана простейшая база данных знакомых, в которой хранятся их имена, места жительства и профессии. Перечисленная информация содержится в разных хеш-массивах с одинаковым набором ключей, которые и связывают информацию по каждому человеку. Выполнение программы этого примера приведет к отображению на экране монитора следующего текста:
Мой знакомый Александр Иванов живет в городе Санкт-Петербург и имеет профессию учитель.
Замечание. Инициализация хеш-массива с помощью списка, элементы которого отделяются друг от друга символом запятая ",", не очень удобно, так как в длинном списке трудно выделять соответствующие пары ключ/значение. Для улучшения наглядности пару ключ/значение можно соединить последовательностью символов "=>", заменив ей разделяющую запятую в списке. Операция "=>" эквивалентна операции "запятая" с той лишь разницей, что ее левый операнд всегда интерпретируется как строковый литерал, даже если он не заключен в кавычки. (Последнее не справедливо для русских букв!)
Рассмотренный нами ранее хеш-массив %m можно инициировать и таким способом:
%m = ( "Имя" => "Ларри", "Фамилия" => "Уолл" );
Добавить новый элемент ассоциативного массива или изменить значение существующего очень легко. Достаточно присвоить его элементу, определяемому заданным ключом, значение в операторе присваивания:
$m{"Имя"} = "Гарри"; # Изменили значение существующего элемента. $m("Телефон"} = "345-56-78"; # Добавили новый элемент.
Если при использовании подобной конструкции ассоциативный массив еще не существовал, то при выполнении операции присваивания сначала будет создан сам массив, а потом присвоится значение его элементу. Ассоциативные массивы, как и массивы скаляров, являются динамическими: все добавляемые элементы автоматически увеличивают их размерность.
Удалить элемент ассоциативного массива можно только с помощью встроенной функции delete:
delete($m{"Телефон"}); # Удалили элемент с ключом "Телефон".
При работе с ассоциативным массивом часто требуется организовать перебор по множеству всех его ключей или значений. В языке существуют две встроенные функции - keys и values, которые представляют в виде списка, соответственно, ключи и значения ассоциативного массива. Следующий фрагмент программы:
print keys(%m), "\n"; # Печать ключей. print values (%m), "\n"; # Печать значений.
ФамилияИмяТелефон УоллЛарри345-56-78
На следующем шаге мы приведем пример практического использования хэш-массива, в частности, для создания списка.