[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