Глава 5: Хеши.
5.4 Хеш-функции
В этом разделе перечислены некоторые функции, предназначенные для обработки хешей.
Функция keys
Функция keys( %имя_хеша ) выдает список всех текущих ключей, имеющихся в хеше %имя_хеша. Другими словами, применение этой функции эквивалентно возвращению всех элементов списка с нечетными номерами (первый, третий, пятый и т.д.) путем развертывания хеша %имя_хеша в списочном контексте, причем функция keys возвращает их именно в этом порядке. Если элементы в хеше отсутствуют, функция keys возвращает пустой список.
Применим эту функцию к хешу из предыдущих примеров:
$fred("aaa") = "bbb";
$fred(234.5) = 456.7;
@list = 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 пустым
$1astname("fred") = "flintstone";
$1astname("barney") = "rubble";
$1astnames = values(tiastname); # получить значения
Массив@lastnames будет содержать либо значения("flintstone", "rubble"), либо("rubble", "flintstone").
Функция each
Для выполнения цикла над всем хешем (т.е. для проверки каждого его элемента) можно использовать функцию keys и получать значения по возвращаемым ею ключам. Действительно, этот метод широко используется, но есть и более эффективный способ — функция each (%имя_хеша), которая возвращает пару ключ-значение как двухэлементный список. При каждом вычислении этой функции для одного хеша возвращается очередная пара ключ-значение, пока не будут проверены все элементы. Если пар больше нет, each возвращает пустой список.
Например, чтобы пройти по хешу %lastname из предыдущего примера, нужно использовать нечто такое:
while ( ($first,$1ast) = each(%lastname)) {
print "The last name of $first is $1ast\n";
}
Присваивание нового значения всему хешу заставляет функцию each перейти в его начало. Добавление элементов в хеш и удаление из него элементов в ходе выполнения цикла вполне может "запутать" функцию each (и вас, наверное, тоже).
Функция delete
Итак, вы можете добавлять элементы в хеш, но пока не можете удалять их (кроме как путем присваивания нового значения всему хешу). Для удаления элементов хеша в Perl используется функция delete. Операнд этой функции — хеш-ссылка, аналогичная той, которая используется для извлечения конкретного значения из хеша. Perl удаляет из хеша соответствующую ссылке пару ключ-значение. Например:
%fred = ("aaa","bbb",234.5,34.56); # добавить в %fred два элемента
delete $fred("aaa"}; # теперь в хеше %fred только одна пара ключ-значение
Назад | Вперед
Содержание (общее) | Содержание раздела
Если Вы не нашли что искали, то рекомендую воспользоваться поиском по сайту:
|