Что такое хеш.
Хеш представляет собой набор скалярных данных, отдельные элементы которого выбираются по индексному значению. Индексные значения хеша - произвольные скаляры (ключи).
Отдельные элементы хеша не стоят в каком-то определенном порядке. Порядок хранения пар ключ-значение изменить нельзя.
Функция delete.
Для удаления элементов хеша используется функция delete.
%test = ("abc", "cba", "12.7", "24.7"); delete $test{"abc"};
Функция each.
Для выполнения цикла над всем хешем можно использовать функцию keys, но есть более эффективный способ - функция each(%hash_name), которая возвращает пару ключ-значение как двухэлементный список. При каждом вычислении этой функции для одного хеша возвращяется очередная пара, пока не будут перебраны все элементы. Если пар больше нет, возвращается пустой список.
while(($first, $last) = each(%test)) { print "The value of $first is $last"; }
Функция keys.
Функция keys(%hash_name) выдает список всех текущих ключей в хеше %hash_name. Если элементы в хеше отсутствуют, функция keys
возвращает пустой список.
Пример:
$test{"abc"} = "cba"; $test{12.7} = 21.7; @list = keys(%test); # @list = ("abc", 12.7) или (12.4, "abc")
Как и в остальных встроенных функциях круглые скобки не обязательны.
foreach $key (keys %test) { print "at $key we have $test{$key}\n"; }
В этом примере отдельные элементы хеша интерполируются в строки в двойных кавычках.
В скалярном контексте функция keys выдает число элементов хеша.
if(keys( %hash)) { ... } # # or # while(keys(%hash) < 10) { ... }
Если обратится к переменной %hash в скалярном контексте, то будет возвращено значение ложь или истина (пустой или нет):
if(%hash) { # если истина ... ... }
Функция values.
Функция values(%hash_name) возвращает список всех текущих значений хеша в том же порядке, в каком функция keys возвращает ключи.
%test = (); # empty $test{"abc"} = "cba"; $test{"def"} = "fed"; @test_values = values(%test); # ("cba", "fed") или ("fed", "cba")
Хеш-функции.
Некоторые функции, предназначенные для обработки хешей.
Хеш-переменные.
Имя хеш переменной состоит из знака процента и буквы или нескольких. Обращение к элементам хеша %test производится путем указания $test{$key}, где $key - любое скалярное выражение.
Создание новых элементов хеша путем присваивания значения:
$test{"abc"} = "cba"; $test{12.7} = 21.7;
Оращение к элементам хеша:
print $test{"abc"}; $test{12.7} += 3; # разультат 24.7
При обращении к несуществующему элементу хеша возвращается значение undef.
Литеральное представление хеша.
Фактически в Perl никакого литерального формата для хеша не предусмотрено, поэтому он просто представляется в виде списка:
@test_list = %test; # @test = qw(abc cba 12.7 24.7); %test1 = @test_list; # создать test1 как test %test1 = %test; # ускоренный метод %test2 = ("abc", "cba", "12.7", "24.7"); # создать %test2 как %test # из литеральных представлений
Порядок пар ключ-значение в этом развернутом формате произвольный и контролю не поддается.
Используя операцию reverse, можно создать хеш, в котором ключи и значения поменяются местами:
%backwards = reverse %normal;
Если %normal имеет два идентичных значения, то в %backwards
они преватятся в один элемент.
Срезы хешей.
Использование среза хеша позволяет обращаться не к одному его элементу, а одновременно к набору.
$score{"mike"} = 205; $score{"igor"} = 150; $score{"nick"} = 30; # or ($score{"mike"}, $score{"igor"}, $score{"nick"}) = (205, 150, 30); # or @score{"mike", "igor", "nick"} = (205, 150, 30); # срез
Можно сочетать использование среза и интерполяции пременных:
@players = qw(mike igor nick); print "scores are: @score{@players}\n";
Срезы хешей можно использовать для слияния меньшего хеша с большим:
@league{keys %score} = values %score;
В этом примерепри наличии ключей-дубликатов используется значение из меньшего хеша.