Perl - Хэши

Хеш - это набор key/valueпары. Переменным хеширования предшествует знак процента (%). Чтобы сослаться на отдельный элемент хэша, вы будете использовать имя хеш-переменной, которому предшествует знак «$», а за ним следует «ключ», связанный со значением в фигурных скобках.

Вот простой пример использования хеш-переменных -

#!/usr/bin/perl

%data = ('John Paul', 45, 'Lisa', 30, 'Kumar', 40);

print "\$data{'John Paul'} = $data{'John Paul'}\n";
print "\$data{'Lisa'} = $data{'Lisa'}\n";
print "\$data{'Kumar'} = $data{'Kumar'}\n";

Это даст следующий результат -

$data{'John Paul'} = 45
$data{'Lisa'} = 30
$data{'Kumar'} = 40

Создание хэшей

Хеши создаются одним из двух следующих способов. В первом методе вы назначаете значение именованному ключу по одному -

$data{'John Paul'} = 45;
$data{'Lisa'} = 30;
$data{'Kumar'} = 40;

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

%data = ('John Paul', 45, 'Lisa', 30, 'Kumar', 40);

Для ясности вы можете использовать => как псевдоним для, чтобы указать пары ключ / значение следующим образом:

%data = ('John Paul' => 45, 'Lisa' => 30, 'Kumar' => 40);

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

%data = (-JohnPaul => 45, -Lisa => 30, -Kumar => 40);

Но важно отметить, что есть одно слово, то есть без пробелов в этой форме формирования хэша использовались ключи, и если вы создадите свой хеш таким образом, то доступ к ключам будет осуществляться только с использованием дефиса, как показано ниже.

$val = %data{-JohnPaul}
$val = %data{-Lisa}

Доступ к хеш-элементам

При доступе к отдельным элементам из хеша вы должны префикс переменной со знаком доллара ($), а затем добавить ключ элемента в фигурные скобки после имени переменной. Например -

#!/usr/bin/perl

%data = ('John Paul' => 45, 'Lisa' => 30, 'Kumar' => 40);

print "$data{'John Paul'}\n";
print "$data{'Lisa'}\n";
print "$data{'Kumar'}\n";

Это даст следующий результат -

45
30
40

Извлечение фрагментов

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

#!/uer/bin/perl


%data = (-JohnPaul => 45, -Lisa => 30, -Kumar => 40);

@array = @data{-JohnPaul, -Lisa};

print "Array : @array\n";

Это даст следующий результат -

Array : 45 30

Извлечение ключей и значений

Вы можете получить список всех ключей из хэша, используя keys функция, которая имеет следующий синтаксис -

keys %HASH

Эта функция возвращает массив всех ключей названного хеша. Ниже приведен пример -

#!/usr/bin/perl 

%data = ('John Paul' => 45, 'Lisa' => 30, 'Kumar' => 40);

@names = keys %data;

print "$names[0]\n";
print "$names[1]\n";
print "$names[2]\n";

Это даст следующий результат -

Lisa
John Paul
Kumar

Точно так же вы можете использовать valuesфункция, чтобы получить список всех значений. Эта функция имеет следующий синтаксис -

values %HASH

Эта функция возвращает обычный массив, состоящий из всех значений названного хэша. Ниже приведен пример -

#!/usr/bin/perl 

%data = ('John Paul' => 45, 'Lisa' => 30, 'Kumar' => 40);

@ages = values %data;

print "$ages[0]\n";
print "$ages[1]\n";
print "$ages[2]\n";

Это даст следующий результат -

30
45
40

Проверка на существование

Если вы попытаетесь получить доступ к паре ключ / значение из несуществующего хеша, вы обычно получите undefinedзначение, и если у вас включены предупреждения, вы получите предупреждение во время выполнения. Вы можете обойти это, используяexists функция, которая возвращает истину, если названный ключ существует, независимо от того, каким может быть его значение -

#!/usr/bin/perl

%data = ('John Paul' => 45, 'Lisa' => 30, 'Kumar' => 40);

if( exists($data{'Lisa'} ) ) {
   print "Lisa is $data{'Lisa'} years old\n";
} else {
   print "I don't know age of Lisa\n";
}

Здесь мы ввели оператор IF ... ELSE, который рассмотрим в отдельной главе. Пока вы просто предполагаете, чтоif( condition ) часть будет выполнена только тогда, когда данное условие истинно, иначе elseчасть будет выполнена. Итак, когда мы выполняем указанную выше программу, она дает следующий результат, потому что здесь существует данное условие ($ data {'Lisa'} возвращает true -

Lisa is 30 years old

Получение размера хэша

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

#!/usr/bin/perl

%data = ('John Paul' => 45, 'Lisa' => 30, 'Kumar' => 40);

@keys = keys %data;
$size = @keys;
print "1 - Hash size:  is $size\n";

@values = values %data;
$size = @values;
print "2 - Hash size:  is $size\n";

Это даст следующий результат -

1 - Hash size: is 3
2 - Hash size: is 3

Добавление и удаление элементов в хэшах

Добавление новой пары ключ / значение может быть выполнено одной строкой кода с использованием простого оператора присваивания. Но чтобы удалить элемент из хеша, вам нужно использоватьdelete функция, как показано ниже в примере -

#!/usr/bin/perl

%data = ('John Paul' => 45, 'Lisa' => 30, 'Kumar' => 40);
@keys = keys %data;
$size = @keys;
print "1 - Hash size:  is $size\n";

# adding an element to the hash;
$data{'Ali'} = 55;
@keys = keys %data;
$size = @keys;
print "2 - Hash size:  is $size\n";

# delete the same element from the hash;
delete $data{'Ali'};
@keys = keys %data;
$size = @keys;
print "3 - Hash size:  is $size\n";

Это даст следующий результат -

1 - Hash size: is 3
2 - Hash size: is 4
3 - Hash size: is 3