São os array associativos.
As variáveis hashings são precedidas de %.
%idade = (); # Cria uma hashing vazio.
%idade = ('jabuti', 80, 'rato', 3, 'cobra', 6);
# Outra maneira de fazer o mesmo acima.
%idade = (tuatara => 35, cachorro => 12, harpia => 40);
%idade{elefante} = 70;
Usando o operador => não é necessário usar aspas, no item a direita
Para acessar os dados de um hashing devemos usar o { e } para indicar o índice e $ precedendo a variável.
$idade_animal = $idade{jabuti};
Podemos acessar os índices dos hashings usando a função key.
# @animais agora é ('harpia', 'tuatara', 'cobra', 'elefante', 'rato', 'cachorro', 'jabuti').
@animais = keys %idade;
Há uma função parecida para os valores.
# @tempo_vida agora é (40, 35, 6, 70, 3, 12, 80).
@tempo_vida = values %idade;
Each retorna uma lista de dois elementos, contendo uma chave do hashing junto com o seu valor associado. Chamadas subsequentes para each retornarão outro par de chave/valor até que todos os pares tenha sido retornados, nesse ponto, um array vazio será retornado.
while ( ($nome, $vida) = each %idade) ) {
print "$nome vive $vida anos\n";
}
Para saber o tamanho de um hashing basta atribuir a um scalar usando a função keys.
# o valor de $quantidade_animais é 3.
$quantidade_animais = keys %idade;
Para acessar partes de um hashing usa se a sintaxe abaixo:
# Mostra a idade da tartaruga.
$mais_velho = {'tartaruga'};
Da mesma forma que é possível dar valores a um hashing, usando uma lista é possível usar a função map para tranformar uma lista num hashing. Por exemplo, o código a seguinte cria uma hashing em que a as chaves são números e os valores seus quadrados.
%quadrado = map { $_ => ($_ * $_) } @numeros;
Segue abaixo um programa que mostra o funcionamento da variável hashing:
1 #!/usr/bin/perl
2
3 use warnings;
4 use strict;
5
6 my %idade;
7 my $nome;
8 my $idade;
9 my $animal;
10 my @animais;
11 my $quantidade_animais;
12 my %mais_velho;
13 my @mais_velho;
14 my %quadrado;
15 my @numeros;
16 my $numero;
17 my $quadrado;
18
19 # Cria uma hashing vazio
20 print "Hashing vazio:\n";
21 %idade = ();
22 print %idade;
23
24 print "\n\n";
25
26 # Cria um hashing com a idade dos animais usando sintaxe de virgulas
27 print "Idade dos animais: \n";
28 %idade = ('jabuti', 80, 'rato', 3, 'cobra', 6);
29 while (($nome, $idade) = each %idade){
30 print "-$nome pode viver até os $idade anos\n";
31 }
32
33 print "\n\n";
34
35 # Adiciona mais itens ao hashing exitente usando a sintaxe de =>
36 print "Idade dos animais: \n";
37 %idade = (%idade, (tuatara => 35, cachorro => 12, harpia => 40));
38 while (($nome, $idade) = each %idade){
39 print "-$nome pode viver até os $idade anos \n";
40 }
41
42 print "\n\n";
43
44 # Adiniciona item individualmente
45 print "Idade dos animais:\n";
46 $idade{elefante} = 70;
47 while (($nome, $idade) = each %idade){
48 print "-$nome pode viver até os $idade anos \n";
49 }
50
51 print "\n\n";
52
53 # Acessando os dados de um hashing específicado pelo índice
54 $animal = 'jabuti';
55 print "A média de vida do $animal é de $idade{$animal} anos \n";
56
57 print "\n\n";
58
59 # Acessando as chaves do hashing
60 print "Os animais são:\n";
61 @animais = keys %idade;
62 foreach (@animais){
63 print "-$_ \n";
64 }
65
66 print "\n\n'";
67
68 # Acessando os valores
69 print "A idades dos animais:\n";
70 @animais = values %idade;
71 foreach (@animais){
72 print "-$_ \n";
73 }
74
75 print "\n\n";
76
77
78 # Pegando o tamanho de um hashing
79 print "Quantidade de animais:\n";
80 $quantidade_animais = keys %idade;
81 print $quantidade_animais;
82
83 print "\n\n";
84
85 # Acessando parte de um hashing
86 print "Animais que vivem mais tempo:\n";
87 @mais_velho = ('jabuti', 'elefante');
88 foreach (@mais_velho){
89 $mais_velho{$_} = $idade{$_};
90 }
91 while (($nome, $idade) = each %mais_velho){
92 print "-$nome vive $idade anos\n";
93 }
94
95 print "\n\n";
96
97 # Montando uma lista contendo o quadrado dos números
98 @numeros = (1, 2, 3, 4, 5, 6);
99 %quadrado = map { $_ => ($_ * $_) } @numeros;
100 while (($numero, $quadrado) = each %quadrado){
101 print "O quandrado de $numero é $quadrado \n";
102 }
Tags: hash