<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     =&gt; 1,</div>
<div>            Monday     =&gt; 2,</div><div>            Tuesday    =&gt; 3,</div><div>            Wednesday  =&gt; 4,</div><div>            Thursday   =&gt; 5,</div><div>            Friday     =&gt; 6,</div><div>            Saturday   =&gt; 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 &quot;uniq: &quot;, join(&#39;,&#39;, @uniq), &quot;\n&quot;;</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* &quot;%&quot; (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 &quot;%&quot; para &quot;$&quot;, 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* &quot;$&quot; seguido do índice ente chaves: &quot;{$k}&quot;.</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  =&gt; 3,</div><div>          2  =&gt; 4,</div>
<div>          3  =&gt; 2,</div><div>          4  =&gt; 2,</div><div>          5  =&gt; 4,</div><div>        )</div><div><br></div><div>    onde &quot;1 =&gt; 3&quot; significa 3 avaliações de uma estrela, &quot;2 =&gt; 4&quot; 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>