Perl практика

         

Что такое хеш.


Хеш представляет собой набор скалярных данных, отдельные элементы которого выбираются по индексному значению. Индексные значения хеша - произвольные скаляры (ключи).

Отдельные элементы хеша не стоят в каком-то определенном порядке. Порядок хранения пар ключ-значение изменить нельзя.



Функция 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;

В этом примерепри наличии ключей-дубликатов используется значение из меньшего хеша.