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 'enter' - \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 '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:<br>
<br><code><br>my %count = ( 'palavra1' => 2,<br> 'palavra2' => 1,<br> 'palavra3' => 4,<br> );<br> <br>
</code><br><br>keys retornará a cada iteração, respectivamente: 'palavra1', 'palavra2', 'palavra3'. 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 '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.<br>
<br>Linha 8 - Finalizando a iteração.<br><br><br>Complicou??? <br><br><br>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.<br>
<code><br>
my(@words, %count, $word,$w); #declarando variaveis... <br>
my $continue='s'; #inicializando $continue, com um valor coerente com as mensagens mais abaixo...<br>
while($continue eq 's'){<br>
<br>
#apenas uma mensagem<br>
print "\nESCREVA ALGO: "; <br>
<br>
#capturando uma palavra via
entrada-padrão<br>
$w = <STDIN>; <br>
<br>
#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...<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 's' mais acima. Se você digitar 'ENTER', sem escrever nada, 's' continuará sendo o valor de $continue<br>
print"\nOUTRA PALAVRA?(s/n)[s]: "; <br>
<br>
# Aqui define-se se você vai ou não
continuar digitando palavras.<br>
$continue=<STDIN>; <br>
<br>
#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? <br>
chomp $continue; <br>
}<br>
<br>
#percorrendo o hash %count. Você pode fazer isso
de outra maneira usando a função 'each'. 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 '$count{$word}', como já mencionado acima.<br>
foreach $word (keys %count) { <br>
print "$word was seen $count{$word}
times.\n";<br>
} <br>
</code><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 "Flávio R. Lopes" <span dir="ltr"><<a href="mailto:flavio.lopes@links.inf.br">flavio.lopes@links.inf.br</a>></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 = <STDIN>);<br>
3 foreach $word (@words) {<br>
4 $count{$word} += 1; <br>
5 }<br>
6 foreach $word (keys %count) { <br>
7 print "$word was seen $count{$word} times.\n";<br>
8 }<br>
<br>
<br>
Nas linhas de 3 a 5 é "armazenado" 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 é "montado" o Hash, ou seja, os valores são
"captados" nas linhas de 3 a 5 e depois "transportados" ou
"armazenados" 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 "armazenados" 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>