Perl - Hashes

Um hash é um conjunto de key/valuepares. Variáveis ​​hash são precedidas por um sinal de porcentagem (%). Para se referir a um único elemento de um hash, você usará o nome da variável hash precedido por um sinal "$" e seguido pela "chave" associada ao valor entre colchetes.

Aqui está um exemplo simples de uso de variáveis ​​hash -

#!/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";

Isso produzirá o seguinte resultado -

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

Criando Hashes

Hashes são criados de uma das seguintes maneiras. No primeiro método, você atribui um valor a uma chave nomeada em uma base um por um -

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

No segundo caso, você usa uma lista, que é convertida tomando pares individuais da lista: o primeiro elemento do par é usado como a chave e o segundo, como o valor. Por exemplo -

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

Para maior clareza, você pode usar => como um alias para, para indicar os pares de chave / valor da seguinte forma -

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

Aqui está mais uma variante da forma acima, dê uma olhada nela, aqui todas as chaves foram precedidas por hífen (-) e nenhuma citação é necessária em torno delas -

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

Mas é importante notar que existe uma única palavra, ou seja, sem espaços as chaves foram usadas nesta forma de formação de hash e se você construir seu hash desta forma, as chaves serão acessadas usando hífen apenas como mostrado abaixo.

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

Acessando Elementos Hash

Ao acessar elementos individuais de um hash, você deve prefixar a variável com um cifrão ($) e, em seguida, anexar a chave do elemento entre chaves após o nome da variável. Por exemplo -

#!/usr/bin/perl

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

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

Isso produzirá o seguinte resultado -

45
30
40

Extraindo fatias

Você pode extrair fatias de um hash da mesma forma que pode extrair fatias de uma matriz. Você precisará usar o prefixo @ para a variável para armazenar o valor retornado porque eles serão uma lista de valores -

#!/uer/bin/perl


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

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

print "Array : @array\n";

Isso produzirá o seguinte resultado -

Array : 45 30

Extraindo chaves e valores

Você pode obter uma lista de todas as chaves de um hash usando keys função, que tem a seguinte sintaxe -

keys %HASH

Esta função retorna um array de todas as chaves do hash nomeado. A seguir está o exemplo -

#!/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";

Isso produzirá o seguinte resultado -

Lisa
John Paul
Kumar

Da mesma forma, você pode usar valuesfunção para obter uma lista de todos os valores. Esta função tem a seguinte sintaxe -

values %HASH

Esta função retorna uma matriz normal que consiste em todos os valores do hash nomeado. A seguir está o exemplo -

#!/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";

Isso produzirá o seguinte resultado -

30
45
40

Verificando a existência

Se você tentar acessar um par chave / valor de um hash que não existe, normalmente obterá o undefinedvalor, e se você tiver avisos ativados, você receberá um aviso gerado em tempo de execução. Você pode contornar isso usando oexists função, que retorna verdadeiro se a chave nomeada existe, independentemente de qual seja seu valor -

#!/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";
}

Aqui, apresentamos a instrução IF ... ELSE, que estudaremos em um capítulo separado. Por agora você apenas assume queif( condition ) parte será executada apenas quando a condição dada for verdadeira, caso contrário elseparte será executada. Então, quando executamos o programa acima, ele produz o seguinte resultado porque aqui a condição dada existe ($ data {'Lisa'} retorna verdadeiro -

Lisa is 30 years old

Obtendo o tamanho do hash

Você pode obter o tamanho - ou seja, o número de elementos de um hash usando o contexto escalar em chaves ou valores. Simplesmente dizendo que primeiro você deve obter uma matriz de chaves ou valores e, em seguida, você pode obter o tamanho da matriz da seguinte forma -

#!/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";

Isso produzirá o seguinte resultado -

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

Adicionar e remover elementos em hash

Adicionar um novo par chave / valor pode ser feito com uma linha de código usando o operador de atribuição simples. Mas para remover um elemento do hash, você precisa usardelete função conforme mostrado abaixo no exemplo -

#!/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";

Isso produzirá o seguinte resultado -

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