Шаг 10.
Хэш-массивы

    На этом шаге мы введем понятие хэш-массива и проиллюстрируем его использование.

    Ассоциативные массивы, называемые также хэш-массивами или просто хэшами позволяют легко создавать динамические структуры данных - списки и деревья разных видов, с помощью которых можно реализовать функциональность простой системы управления базой данных. Подобной конструкции не найти ни в одном современном языке программирования.

    Ассоциативные массивы отличаются от массивов скаляров тем, что в них для ссылки на элементы используются строки, а не числовые индексы, то есть концептуально они представляют собой список не просто значений элементов массива, а последовательность ассоциированных пар ключ/значение. Ключ является строковым литералом, и именно он и используется для доступа к ассоциированному с ним значению массива. В программе хеши задаются аналогично массивам скаляров с помощью конструктора, представляющего собой список, заключенный в круглые скобки, в котором пары ключ/значение следуют друг за другом:

  (ключ_1, значение_1, ключ_2, значение_2, ..., ключ_n, значение_n)

    Для хранения ассоциированных массивов, как и для других элементов данных, используются переменные, первым символом которых является символ процента %. Переменные, в которых хранятся ассоциативные массивы, часто называют хэш-переменными. Ассоциативный массив создается во время операции присвоения такой переменной списка значений:

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

    В ассоциативном массиве %m ключами являются строки "Имя" и "Фамилия", а ассоциированными с ними значениями, соответственно, "Ларри" и "Уолл". Теперь, чтобы получить значение, соответствующее какому-либо ключу, следует воспользоваться конструкцией:

    $m{"ключ"}

    При работе с элементом ассоциативного массива, символ хэш-переменной "%" заменяется на символ скалярной переменной "$". Аналогично поступают и при ссылке на элемент массива скаляров. Единственное отличие - ключ задается в фигурных скобках. Итак, чтобы, например, присвоить некоторой скалярной переменной значение элемента хэш-массива %m, следует воспользоваться следующим оператором:

    $surname = $m{"Фамилия"};
Теперь скалярная переменная $surname имеет в качестве своего значения строку Уолл.

    Таким образом, хэш-массивы позволяют обращаться к своим элементам не с помощью числового индекса, а с помощью индекса, представленного строкой.

    Приведем пример использования хэш-массивов.

%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"; # Печать значений.
отобразит на экране монитора строку ключей и строку значений массива %m:
ФамилияИмяТелефон 
УоллЛарри345-56-78

    На следующем шаге мы приведем пример практического использования хэш-массива, в частности, для создания списка.




Предыдущий шаг Содержание Следующий шаг