Хеш-функции
В этом разделе перечислены некоторые функции, предназначенные для обработки хешей.
Функция keys
Функция keys( %имя_хеша) выдает список всех текущих ключей, имеющихся в хеше %имя_хеша. Другими словами, применение этой функции эквивалентно возвращению всех элементов списка с нечетными номерами (первый, третий, пятый и т.д.) путем развертывания хеша %имя_хеша в списочном контексте, причем функция keys возвращает их именно в этом порядке. Если элементы в хеше отсутствуют, функция keys возвращает пустой список.
Применим эту функцию к хешу из предыдущих примеров:
$fred("aaa"} = "bbb";
$fred{234.5) = 456.7;
Olist = keys(%fred); # @list получает значение ("ааа",234.5) # или (234.5,"ааа")
Как и во всех остальных встроенных функциях, круглые скобки не обязательны: функция keys %fred
полностью идентична keys (%fred).
foreach $key (keys (%fred)) ( # однократно для каждого значения хеша %fred
print "at $key we have $fred($key}\n"; # показать ключ и значение }
В этом примере показано также, что отдельные элементы хеша могут интерполироваться в строки в двойных кавычках. Весь хеш, однако, интерполировать таким образом нельзя*.
В скалярном контексте функция keys выдает число элементов (пар ключ-значение), содержащихся в хеше. Например, вы можете выяснить, пуст ли хеш, так:
if (keys(%xeni)) { # если keys() не равно 0:
...; # массив не пустой )
# ... или ...
while (keys(%xem) < 10) {
. . .; # продолжать цикл, пока меньше 10 элементов }
Для того чтобы узнать, пуст хеш или нет, нужно просто использовать функцию %хеш в скалярном контексте:
if (%хеш) ( # если "истина", в нем что-то есть
# что-то сделать )
Функция values
Функция values (%имя_массива) возвращает список всех текущих значений указанного массива в том же порядке, в каком функция keys ( %имя_массива}
возвращает ключи. Как всегда, круглые скобки не обязательны. Например:
%lastname =0; # сделать %lastname пустым $lastname("fred"} = "flintstone";
$lastname("barney"} = "rubble";
Olastnames = values(tiastname); # получить значения
Массив
@lastnames будет содержать либо значения ("flintstone", "rubble"), либо ("rubble", "flintstone").
Функция each
Для выполнения цикла над всем хешем (т.е. для проверки каждого его элемента) можно использовать функцию keys и получать значения по возвращаемым ею ключам. Действительно, этот метод широко используется, но есть и более эффективный способ — функция each ( %имя_хеша),
которая возвращает пару ключ-значение как двухэлементный список. При каждом вычислении этой функции для одного хеша возвращается очередная пара ключ-значение, пока не будут проверены все элементы. Если пар больше нет, each возвращает пустой список.
* Можно, в принципе, с помощью среза, но здесь о срезах мы не говорим.
Например, чтобы пройти по хешу %lastname из предыдущего примера, нужно использовать нечто такое:
while ( ($first,$last) = each(%lastname)) {
print "The last name of $first is $last\n";
}
Присваивание нового значения всему хешу заставляет функцию each перейти в его начало. Добавление элементов в хеш и удаление из него элементов в ходе выполнения цикла вполне может "запутать" функцию each (и вас, наверное, тоже).
Функция delete
Итак, вы можете добавлять элементы в хеш, но пока не можете удалять их (кроме как путем присваивания нового значения всему хешу). Для удаления элементов хеша в Perl используется функция delete. Операнд этой функции — хеш-ссылка, аналогичная той, которая используется для извлечения конкретного значения из хеша. Perl удаляет из хеша соответствующую ссылке пару ключ-значение. Например:
%fred = ("aaa","bbb",234.5,34.56); # добавить в %fred два элемента delete $fred("aaa"}; # теперь в хеше %fred только одна пара ключ-значение