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