Просматривая статистику, я обнаружила, что большая часть посетителей ищет информацию «для начинающих». Теперь планирую опубликовать описание всех встроенных в perl функций. Вполне вероятно, за несколько месяцев эту задачу можно выполнить. Сегодня — описание функций для работы с хешами.
keys
|
1 |
keys HASH |
Функция keys возвращает список всех ключей заданного хеша. Ключи возвращаются в случайном порядке, без какой либо сортировки. При необходимости, список можно отсортировать позднее.
Пример:
|
1 2 3 4 5 6 7 8 9 10 11 12 |
#!/usr/local/bin/perl my %hash = ( 'line1' => 'Изменения в природе', 'line2' => 'Происходят год от года', 'line3' => 'Непогода нынче в моде', 'line4' => 'Непогода, непогода...', ); my @array = keys %hash; print join(' ', @array)."\n"; |
Вывод:
|
1 2 3 |
%perl hash.pl line3 line4 line1 line2 |
В скалярном контексте keys возвращает число элементов в хеше.
|
1 |
print keys(%hash)."\n"; |
values
|
1 |
values %HASH |
Функция возвращает список, содержащий все значения хеша. Значения возвращаются в случайном порядке.
Пример:
|
1 2 3 4 5 6 7 8 9 10 |
my %hash = ( 'line1' => 'Изменения в природе', 'line2' => 'Происходят год от года', 'line3' => 'Непогода нынче в моде', 'line4' => 'Непогода, непогода...', ); my @array = values %hash; print join("\n",@array)."\n"; |
Вывод:
|
1 2 3 4 5 6 |
%perl hash.pl Непогода нынче в моде Непогода, непогода... Изменения в природе Происходят год от года |
Возвращаемый функцией values список, содержит не копии значений, а их псевдонимы. Поэтому, с помощью values можно изменять содержимое хеша.
Пример:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
my %hash = ( 'line1' => 'Изменения в природе', 'line2' => 'Происходят год от года', 'line3' => 'Непогода нынче в моде', 'line4' => 'Непогода, непогода...', ); foreach (values %hash) { $_ = '* '.$_; } my @array = values %hash; print join("\n",@array)."\n"; |
Вывод:
|
1 2 3 4 5 6 |
%perl hash.pl * Непогода нынче в моде * Непогода, непогода... * Изменения в природе * Происходят год от года |
each
|
1 |
each HASH |
Функция проходит хеш, возвращая пару — ключ и значение. В списковом контексте возвращает одну пару хеша. В скалярном контексте возвращает очередной ключ хеша.
Пример:
|
1 2 3 4 5 |
my @array = each %hash; print join(" ",@array)."\n"; my @array = each %hash; print join(" ",@array)."\n"; |
Вывод:
|
1 2 3 4 |
%perl hash.pl line3 Непогода нынче в моде line4 Непогода, непогода... |
Каждый хеш имеет собственный итератор. Функции each, keys и values используют его для определения того, какой элемент был возвращен последним, и какой будет возвращен во время следующей итерации. Если хеш пройден полностью, значение итератора сбрасывается. Сбросить значение итератора можно выполнив функцию keys %hash или values %hash.
exists
|
1 |
exists EXPR |
Функция exists проверяет наличие указанного ключа (или индекса) в хеше (или массиве). Если ключ найден — возвращает true. С помощью exists можно осуществлять проверку наличия элементов в сложных структурах данных.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
my %hash = ( 'text1' => { 'line1' => 'Изменения в природе', 'line2' => 'Происходят год от года', 'line3' => 'Непогода нынче в моде', 'line4' => 'Непогода, непогода...', }, 'text2' => { 'line1' => 'Не ангина, не простуда, посерьезнее беда', 'line2' => 'Полгода плохая погода, полгода совсем никуда...', }, ); if (exists $hash{text2}->{line2}) { print $hash{text2}->{line2}."\n"; } |
С помощью exists можно проверять наличие нужных подпрограмм в коде.
|
1 2 3 4 5 6 7 8 9 |
print "OK" if exists &ok; sub ok { return 1; } sub not { return 0; } |
delete
|
1 |
delete EXPR |
Функция удаляет элемент из хеша или массива. Возвращает список удаленных элементов.
Пример:
|
1 2 3 4 5 6 7 8 9 10 |
my %hash = ( 'line1' => 'Изменения в природе', 'line2' => 'Происходят год от года', 'line3' => 'Непогода нынче в моде', 'line4' => 'Непогода, непогода...', ); delete $hash{'line4'}; print join(' ', keys %hash)."\n"; |
Вывод:
|
1 2 3 |
%perl hash.pl line3 line1 line2 |
Не рекомендуется использовать delete, если необходимо удалить все элементы из хеша или массива. Для удаления всех элементов лучше использовать %hash = (); и @array = ();