[SP-pm] Duvida com Hashes

Otávio Fernandes otaviof at gmail.com
Sun Apr 18 19:55:42 PDT 2010


2010/4/18 "Flávio R. Lopes" <flavio.lopes em links.inf.br>:
> Pessoal, no livro que estou lendo, mais especificamente no capítulo que
> trata de Hashes, tem um exercício proposto em que o autor pede para elaborar
> um programa em que o usuário digita palavras (nomes, por exemplo) e o
> sistema tem que contar quantas vezes foram digitados as mesmas palavras.
>
> Abaixo segue a solução apresentada pelo autor:
>
> 1    my(@words, %count, $word);
> 2    chomp(@words = <STDIN>);
> 3    foreach $word (@words) {
> 4    $count{$word} += 1;
> 5    }
> 6    foreach $word (keys %count) {
> 7      print "$word was seen $count{$word} times.\n";
> 8    }
>
>
> Nas linhas de 3 a 5 é "armazenado" o número de vezes que uma palavra
> aparece, ou seja, é feita uma contagem, certo?
>
> Agora é aqui que não entendi direito (nas linhas de 6 a
> 8)....especificamente no trecho (keys %count) O que fiquei em dúvida se é
> aqui que é "montado" o Hash, ou seja, os valores são "captados" nas linhas
> de 3 a 5 e depois "transportados" ou "armazenados" no Hash %count da linha 6
> ??, pois os valores digitados pelo usuário são armazenados no Array @words,
> contados nas linhas de 3 a 6 e "armazenados" no hash %count ???
>
> Não sei se fui claro, mas como é o raciocínio disto?...Vcs poderia me ajudar
> a ler e entender este código?
>
> abraço,
> Flávio
>
> _______________________________________________
> SaoPaulo-pm mailing list
> SaoPaulo-pm em pm.org
> http://mail.pm.org/mailman/listinfo/saopaulo-pm

Flávio,

Nas linhas 6 a 8 o autor dá um exemplo de como fazer a leitura do Hash.
Sabemos que no Perl esta estrutura é composta por chaves ("keys") e valores,
correto? Então:

6 foreach my $word ( keys %count ) {

Poderiamos ler como, para cada chave no array, atribua seu valor ao scalar
"$word".

7 print "$word was seen $count{$word} times.\n";

Com a explicação da linha 6, acredito que esta parte ficou clara o suficiente,
no qual a estrutura "$count{$word}" é uma entrada dentro do hash que foi
utilizada para contar quantas vezes a palavra apareceu.

Fiz um exemplo mais simples, usando uma referência, para exemplificar como
esta estrutura seria tratada:

#!/usr/bin/env perl

use strict;
use warnings;

use Data::Dumper;

my $count = {
    otaviof   => int( rand(10) ),
    mantovani => int( rand(24) ),
    flavio    => int( rand(10) ),
};

print Dumper $count;

__END__

Veja como ela fica na memória, isso ajuda muito na abstração:

otaviof em tyrell:~$ perl /var/tmp/count_word.pl
$VAR1 = {
          'mantovani' => 4,
          'otaviof' => 1,
          'flavio' => 5
        };

Espero que tenha ficado mais claro agora.

um abraço,

-- 
Otávio Fernandes
otaviof at ( gmail.com, cpan.org )
http://blog.emresumo.com/


More information about the SaoPaulo-pm mailing list