Язык программирования Perl
Шрифт:
В приведенных выше примерах при необходимости обработки ключей хэша в алфавитном порядке они сортировались с помощью функции sort. Вот пример обработки хэша в порядке возрастания не его ключей, а его значений:
Здесь
Подобно тому, как при работе с массивами срезы позволяют работать со списком элементов, в Perl есть возможность обращаться сразу с несколькими элементами хэша. Это делается с помощью среза хэша. Срез хэша (hash slice) - это список значений хэша, заданный перечнем соответствующих ключей. Он записывается в виде имени хэша с префиксом @ (так как срез - это список), за которым в фигурных скобках перечисляются ключи. Список ключей в срезе хэша можно задать перечислением скалярных значений, переменной-списком или списком, возвращенным функцией. Например, так:
Если в срезе хэша список ключей состоит из единственного ключа, срез все равно является списком, хотя и из одного значения. Сравните:
Поскольку переменная-хэш в составе строки не интерполируется, для вставки в строку всех значений хэша можно воспользоваться срезом хэша:
Срез хэша, как и любой другой список, может стоять в левой части операции присваивания. При этом списку ключей среза должен соответствовать список присваиваемых значений в правой части присваивания. Воспользовавшись срезом, можно добавить в хэш сразу несколько пар или объединить два хэша, добавив к одному другой. Например:
С помощью среза хэша и функций keys и values можно поменять в хэше местами ключи и значения, то есть сделать значения ключами, а ключи - значениями.
Исполняющая система Perl предоставляет программисту доступ к специальным ассоциативным массивам, в которых хранится полезная служебная информация. Вот некоторые из специальных хэшей:
Например, так при выполнении программы можно использовать значения переменных окружения: перечислить все их значения или выбрать нужные.
Рассмотренный в этой лекции тип данных - хэш - не добавляет нового типа контекста: ключи и значения отдельных элементов хэша - это скалярные величины, а перечень всех элементов хэша, срезы хэша, выборки всех его ключей и всех его значений - это списки. Хотя переменная-хэш хранит особое значение - ассоциативный массив, но когда она применяется в левой части операции присваивания, она создает списочный контекст. На этом основаны приемы инициализации хэшей значениями списков. Поэтому же, например, при присваивании хэшу скалярной величины она рассматривается как список, состоящий из одного элемента, и этот элемент становится единственным ключом в хэше, с которым ассоциируется неопределенное (не присвоенное) значение:
В этой лекции завершается изучение основных типов данных в языке Perl: скаляров, списков и хэшей. В таблице 6.1 для сравнения приведены контексты и форматы обращения к скалярным переменным, элементам массивов и хэшей и их срезам.
Таблица 6.1. Форматы записи переменных
Конструкция | Хранимое значение | Описание | Контекст (в левой части присваивания) |
---|---|---|---|
@variable | список | весь массив @variable | списочный |
%variable | хэш | весь хэш %variable | списочный |
$variable | скаляр | просто скалярная переменная | скалярный |
$variable[$index] | скаляр | элемент массива @variable, заданный индексом $index | скалярный |
@variable[@list] | список | срез массива @variable, заданный списком индексов @list | списочный |
@variable[$index] | список (из одного элемента) | срез массива @variable, заданный списком из одного индекса $index | списочный |
$variable{$key} | скаляр | элемент хэша %variable | скалярный |
@variable{@list} | список (значений) | срез хэша %variable, заданный списком ключей @list | списочный |
@variable{$key} | список (из одного значения) | срез хэша %variable, заданный списком из одного ключа $key | списочный |