[Triangulo-pm] [Perl 5 - Básico] #5 Hashes
Adriano Ferreira
a.r.ferreira em gmail.com
Domingo Agosto 2 08:42:49 PDT 2009
[Perl 5 - Básico] #5 Hashes
Perl 5 *hashes* são estruturas de dados que indexam valores através de
chaves *strings*.
%days = (
Sunday => 1,
Monday => 2,
Tuesday => 3,
Wednesday => 4,
Thursday => 5,
Friday => 6,
Saturday => 7,
);
*Hashes* são *arrays* associativos, conhecidos por diferentes nomes em
diferentes linguagens de programação: por exemplo, dicionários em
Python e Smalltalk, mapas em Java.
Saber utilizar bem dos *hashes* em seu código simplifica uma variedade
de problemas, alguns dos quais se tornam extremamente triviais com o uso
destas estruturas.
Por exemplo, dado um *array* de *strings*, remova todos os valores
repetidos, produzindo um novo *array*:
@array = qw(one two one three four four five five five);
my %seen; # hash de strings já vistos
my @uniq; # o novo array que conterá os elementos sem duplicatas
for my $s (@array) {
next if $seen{$s}; # ignore se já visto
push @uniq, $s; # inclua no hash, pois é $s é uma novidade
$seen{$s}++; # atualize o hash
}
print "uniq: ", join(',', @uniq), "\n";
O código acima vai produzir a saída:
uniq: one,two,three,four,five
Variáveis *hash* são identificadas pelo *sigil* "%" (o *sigil* é o
primeiro caracter no nome da variável).
my %seen;
cria uma variável léxica %seen que é um *hash*. Um elemento do *hash*
tem uma sintaxe diferente:
$seen{$k}
Perceba que o *sigil* mudou, de "%" para "$", porque o elemento do
*hash* é uma variável escalar. Nesta expressão, o que nos permite
identificar que uma variável *hash* está sendo acessada é
simultaneamente o *sigil* "$" seguido do índice ente chaves: "{$k}".
Outro exemplo do possível uso de *hashes* é uma solução para um
problema do tipo: dada uma lista de avaliações de um produto qualquer
de 1 a 5 estrelas, calcule quantas vezes o produto recebeu 1 estrela, 2
estrelas e assim por diante. Calcule também a média de estrelas
atribuída ao produto:
@ratings = (1,2,3,4,3,4,2,1,5,5,5,5,1,2,2);
my %stars;
my $sum;
$stars{$_}++, $sum+=$_ for @ratings;
my $average = $sum/(scalar @ratings);
Executado este código, o *hash* %stars vai conter:
(
1 => 3,
2 => 4,
3 => 2,
4 => 2,
5 => 4,
)
onde "1 => 3" significa 3 avaliações de uma estrela, "2 => 4" são 4
avaliações de duas estrelas, e assim por diante. A variável $average
vai terminar com 3, que é o número médio de estrelas calculado a
partir destas notas:
(1+2+3+4+3+4+2+1+5+5+5+5+1+2+2)/15
Triangulo-pm, 2009-08-02 11:00
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.pm.org/pipermail/triangulo-pm/attachments/20090802/eff3cf3b/attachment.html>
Mais detalhes sobre a lista de discussão Triangulo-pm