[SP-pm] Duvida com Hashes

"Flávio R. Lopes" flavio.lopes at links.inf.br
Tue Apr 20 18:16:31 PDT 2010


Obrigado André!...ficou claríssimo!

Andre Carneiro escreveu:
> Linha 1 - declarando variáveis...
> Linha 2 - Recuperando entrada via teclado, armazenando em @words sem o 
> terminador(quem tira o terminador é chomp - veja em perldoc -f chomp). 
> # Terminador nesse caso = caracter que representa o 'enter'  - \n no UNIX
>                  No entanto, você precisa fazer CTRL+D para parar de 
> colocar coisas dentro de @words.
>
> Linha 3 - Iniciando a Iteração(laço) do array @words
> Linha 4 - Para cada iteração, se você digitar a mesma palavra, perl 
> vai acrescentar 1 a um contador cuja a chave é a palavra que você digitou.
> Linha 5 - Termina a iteração do array @words.
> Linha 6 - Inicia a iteração do hash %count que foi preenchido entre as 
> linhas 3 e 5. Aqui, utiliza-se foreach + a função 'keys', passando 
> como parâmetro o hash %count.(Sem o parênteses fica esquisito??? keys 
> %count  idêntico a keys(%count) ok??? Em Perl vc pode suprimir 
> parênteses em algumas ocasiões.  Voltando, keys nesse caso, está 
> retornando uma chave do hash a cada iteração, ou seja, se você tiver 
> um hash assim:
>
> <code>
> my %count = ( 'palavra1' => 2,
>                            'palavra2' => 1,
>                            'palavra3' => 4,
>                          );
>                      
> </code>
>
> keys retornará a cada iteração, respectivamente: 'palavra1', 
> 'palavra2', 'palavra3'. Mais detalhes na documentação:  perldoc -f keys
>
> Linha 7 - Aqui você já está apto a imaginar o que acontece. As 
> palavras são as chaves(cada valor retornado por 'keys' em cada 
> iteração). Se você tem as chaves, para obter os valores, basta passar 
> a chave para o hash retornar, ou seja, '$count{$word}' . Por que não 
> %count{$word} ???? Em Perl 5, para obter um valor qualquer do hash, vc 
> precisa que isso esteja em contexto escalar. Isso em Perl é 
> representado por $ e não por %. Mais detalhes sobre isso veja em:  
> perldoc perlintro.
>
> Linha 8 - Finalizando a iteração.
>
>
> Complicou???
>
>
> O código abaixo está um pouco menos  'alienígena', embora o código 
> seja  mais longo. No entanto faz a mesma coisa e explica mais 
> detalhadamente o que acontece.
>              <code>
>                         my(@words, %count, $word,$w); #declarando 
> variaveis...
>                         my $continue='s'; #inicializando $continue, 
> com um valor coerente com as mensagens mais abaixo...
>                         while($continue eq 's'){
>
>                                #apenas uma mensagem
>                                print "\nESCREVA ALGO: ";
>
>                                 #capturando uma palavra via entrada-padrão
>                                $w = <STDIN>;
>
>                                #retirando o terminador (\n se UNIX). 
> Por que? Porque senão vc inclui o 'enter' na palavra. Aqui não faria 
> diferença, mas se vc precisasse comparar $w com outra string qualquer 
> poderia ser um problema, se a outra string não tivesse o terminador 
> também. Por definição, retire os terminadores...
>                                chomp $w; 
>
>                                #inserindo as palavras no array
>                                push @words, $w;
>
>                                 #Fazendo a contagem de palavras. Como 
> você está passando a palavra que vc digitou como chave, e relacionando 
> isso a um contador, toda a vez que você repetir isso na iteração, perl 
> vai incrementar o contador no lugar certo, ou seja, toda a vez que vc 
> digitar a mesma palavra, o contador será acrecido(ou acrescido)... de um.
>                                $count{$w} += 1;
>
>                                #critica para continuar(ou não), a 
> inserir palavras. Aqui é a mensagem. A linha de baixo armazena a 
> resposta da crítica em $continue...
>                                #lembre-se que $continue foi 
> inicalizado com o valor 's' mais acima. Se você digitar 'ENTER', sem 
> escrever nada, 's' continuará sendo o valor de $continue
>                                print"\nOUTRA PALAVRA?(s/n)[s]: ";
>
>                                # Aqui define-se se você vai ou não 
> continuar digitando palavras.
>                                $continue=<STDIN>; 
>
>                                #retira o terminador \n. Por que?  
> Repare no while ---->   while($continue eq 's') ... Isso significa que 
> ele vai comparar continue com 's', e não com "s\n", entendeu?
>                                chomp $continue;
>                           }
>
>                        #percorrendo o hash %count. Você pode fazer 
> isso de outra maneira usando a função 'each'. Veja em perldoc -f each.
>                        # $word vai receber a cada iteração uma chave 
> do hash %count. Portanto para obter cada valor em %count em uma 
> iteração, basta utlizar '$count{$word}', como já mencionado acima.
>                         foreach $word (keys %count) {
>                              print "$word was seen $count{$word} 
> times.\n";
>                         }             
>                </code>
>
>
> Espero ter sido claro.
>
>
> Cheers!
>
>                                   
>             
>              
>
>
> 2010/4/18 "Flávio R. Lopes" <flavio.lopes em links.inf.br 
> <mailto: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?
>
>
> Você testou esse código?
>  
>
>     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 <mailto:SaoPaulo-pm em pm.org>
>     http://mail.pm.org/mailman/listinfo/saopaulo-pm
>
>
>
>
> -- 
> André Garcia Carneiro
> Analista/Desenvolvedor Perl
> (11)82907780
> ------------------------------------------------------------------------
>
> _______________________________________________
> SaoPaulo-pm mailing list
> SaoPaulo-pm em pm.org
> http://mail.pm.org/mailman/listinfo/saopaulo-pm



More information about the SaoPaulo-pm mailing list