Linha 1 - declarando variáveis...<br>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 &#39;enter&#39;  - \n no UNIX<br>
                 No entanto, você precisa fazer CTRL+D para parar de colocar coisas dentro de @words. <br><br>Linha 3 - Iniciando a Iteração(laço) do array @words<br>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.<br>
Linha 5 - Termina a iteração do array @words.<br>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 &#39;keys&#39;, 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:<br>
<br>&lt;code&gt;<br>my %count = ( &#39;palavra1&#39; =&gt; 2,<br>                           &#39;palavra2&#39; =&gt; 1,<br>                           &#39;palavra3&#39; =&gt; 4,<br>                         );<br>                      <br>
&lt;/code&gt;<br><br>keys retornará a cada iteração, respectivamente: &#39;palavra1&#39;, &#39;palavra2&#39;, &#39;palavra3&#39;. Mais detalhes na documentação:  perldoc -f keys<br><br>Linha 7 - Aqui você já está apto a imaginar o que acontece. As palavras são as chaves(cada valor retornado por &#39;keys&#39; em cada iteração). Se você tem as chaves, para obter os valores, basta passar a chave para o hash retornar, ou seja, &#39;$count{$word}&#39; . 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.<br>
<br>Linha 8 - Finalizando a iteração.<br><br><br>Complicou??? <br><br><br>O código abaixo está um pouco menos  &#39;alienígena&#39;, embora o código seja  mais longo. No entanto faz a mesma coisa e explica mais detalhadamente o que acontece.<br>
             &lt;code&gt;<br>
                        my(@words, %count, $word,$w); #declarando variaveis... <br>
                        my $continue=&#39;s&#39;; #inicializando $continue, com um valor coerente com as mensagens mais abaixo...<br>
                        while($continue eq &#39;s&#39;){<br>
<br>
                               #apenas uma mensagem<br>
                               print &quot;\nESCREVA ALGO: &quot;; <br>
<br>
                                #capturando uma palavra via 
entrada-padrão<br>
                               $w = &lt;STDIN&gt;; <br>
<br>
                               #retirando o terminador (\n se UNIX). Por 
que? Porque senão vc inclui o 
&#39;enter&#39; 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...<br>
                               chomp $w;  <br>
<br>
                               #inserindo as palavras no array<br>
                               push @words, $w; <br>
<br>
                                #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.<br>
                               $count{$w} += 1; <br>
<br>
                               #critica para continuar(ou não), a 
inserir palavras. Aqui é a mensagem.
 A linha de baixo armazena a resposta da crítica em $continue...<br>                               #lembre-se que $continue foi inicalizado com o valor &#39;s&#39; mais acima. Se você digitar &#39;ENTER&#39;, sem escrever nada, &#39;s&#39; continuará sendo o valor de $continue<br>

                               print&quot;\nOUTRA PALAVRA?(s/n)[s]: &quot;; <br>
<br>
                               # Aqui define-se se você vai ou não 
continuar digitando palavras.<br>
                               $continue=&lt;STDIN&gt;;  <br>
<br>
                               #retira o terminador \n. Por que?  Repare no while ----&gt;   
while($continue eq &#39;s&#39;) ... Isso significa que ele vai comparar continue
 com &#39;s&#39;, e não com &quot;s\n&quot;, entendeu? <br>
                               chomp $continue; <br>
                          }<br>
<br>
                       #percorrendo o hash %count. Você pode fazer isso 
de outra maneira usando a função &#39;each&#39;. Veja em perldoc -f each.<br>                       # $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 &#39;$count{$word}&#39;, como já mencionado acima.<br>

                        foreach $word (keys %count) { <br>

                             print &quot;$word was seen $count{$word} 
times.\n&quot;;<br>

                        }              <br>

               &lt;/code&gt;<br><br><br>Espero ter sido claro.<br><br><br>Cheers!<br><br>                                   <br>             <br>              <br><br><br><div class="gmail_quote">2010/4/18 &quot;Flávio R. Lopes&quot; <span dir="ltr">&lt;<a href="mailto:flavio.lopes@links.inf.br">flavio.lopes@links.inf.br</a>&gt;</span><br>
<blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">



<div bgcolor="#ffffff" text="#000000">
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.<br>
<br>
Abaixo segue a solução apresentada pelo autor:<br>
<br>
1    my(@words, %count, $word);     <br>
2    chomp(@words = &lt;STDIN&gt;);<br>
3    foreach $word (@words) {<br>
4    $count{$word} += 1;          <br>
5    }<br>
6    foreach $word (keys %count) { <br>
7      print &quot;$word was seen $count{$word} times.\n&quot;;<br>
8    }<br>
<br>
<br>
Nas linhas de 3 a 5 é &quot;armazenado&quot; o número de vezes que uma palavra
aparece, ou seja, é feita uma contagem, certo?<br>
</div></blockquote><div><br>Você testou esse código? <br> </div><blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;"><div bgcolor="#ffffff" text="#000000">

Agora é aqui que não entendi direito (nas linhas de 6 a
8)....especificamente no trecho <b>(keys %count)</b> O que fiquei em
dúvida se é aqui que é &quot;montado&quot; o Hash, ou seja, os valores são
&quot;captados&quot; nas linhas de 3 a 5 e depois &quot;transportados&quot; ou
&quot;armazenados&quot; no Hash <b>%count</b> da linha 6 ??, pois os valores
digitados pelo usuário são armazenados no Array @words, contados nas
linhas de 3 a 6 e &quot;armazenados&quot; no hash <b>%count</b> ???<br>
<br>
Não sei se fui claro, mas como é o raciocínio disto?...Vcs poderia me
ajudar a ler e entender este código?<br>
<br>
abraço,<br>
Flávio<br>
</div>

<br>_______________________________________________<br>
SaoPaulo-pm mailing list<br>
<a href="mailto:SaoPaulo-pm@pm.org">SaoPaulo-pm@pm.org</a><br>
<a href="http://mail.pm.org/mailman/listinfo/saopaulo-pm" target="_blank">http://mail.pm.org/mailman/listinfo/saopaulo-pm</a><br></blockquote></div><br><br clear="all"><br>-- <br>André Garcia Carneiro<br>Analista/Desenvolvedor Perl<br>
(11)82907780<br>