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