[Cascavel-pm] Ordenar hash

Gabriel Vieira gabriel.vieira em gmail.com
Sexta Fevereiro 16 20:35:30 PST 2007


Opa,

isso é realmente instigante a não ser que você se acostume :P hehe

Bom, usaremos o operador <=> que é utilizado para comparações de valores
numéricos junto ao comando sort. Para a comparação de strings utilizar-se-á
o operador 'cmp'.

Como é ordem crescente então será usado $a <=> $b, onde $a e $b são
variáveis especiais usadas pelo sort e contêm os valores dos itens que estão
sendo comparados.

Para um melhor entendimento:
---------------------------8<---------------------------
print "Variáveis \$a e \$b dentro do comando sort:\n";
%hash = ("AA",5,"CB",2,"BA",10,"TG",3);
foreach ( sort {print "$a $b\n";} keys %hash ){}
--------------------------->8---------------------------
* O exemplo acima só exibe como a comparação é feita.

O conceito é simples, para cada comparação é retornado um valor que poderá
ser -1 ($a tem valor inferior a $b), 0 ($a e $b possuem valores identicos) e
1 ($a tem valor superior ao de $b). Note que o uso de $b <=> $a faz a
comparação reversa.

Feitas as comparações necessárias, teremos o resultado:
---------------------------8<---------------------------
%hash = ("AA",5,"CB",2,"BA",10,"TG",3);
foreach ( sort {$a cmp $b} keys %hash ){ print "$_\n";}
--------------------------->8---------------------------
* Uso do cmp por estarmos comparando as strings.


Por fim, queremos comparar os valores; logo temos que: como $a e $b contêm o
valor do item, no caso do uso sobre o keys %hash conterá o nome de cada
chave percorrida, então usaremos $hash{$a} e $hash($b} que resultará no
valor referente de cada uma das chaves.

---------------------------8<---------------------------
%hash = ("AA",5,"CB",2,"BA",10,"TG",3);

print "Pelas Chaves\n";
print "$_ - $hash{$_}\n" foreach sort keys %hash;

print "\nPelos Valors\n";
print "$_ - $hash{$_}\n" foreach sort {$hash{$a} <=> $hash{$b}} keys %hash;
--------------------------->8---------------------------

É isso.

Simples como um oi. ;D

Abraços,

On 2/16/07, Wagner Arbex <arbex em email.com.br> wrote:
>
> Prezados colegas;
>
> Apesar de ser um programador com razoável tempo de estrada, comecei a
> trabalhar com Perl muito recentemente... estou no início mesmo.
>
> Assim, estou aprendendo o caminho das pedras, principalmente me
> acostumando com a sintaxe e com a idéia de que "existe mais e uma
> maneira de fazer", além disso, tb estou muito impressionado com o que
> posso fazer e com a flexibilidade que tenho com poucas linhas de
> código.
>
> Tenho uma dúvida de iniciante que já pesquisei bastante, mas não acho
> a resposta. Parece ser uma dúvida ridícula, mas...
>
> A questão é que tenho um hash bastante simples, por ex:
>
> %hash1 = ("AA",0,"CB",0,"BA",0,"TG",0);
>
> Durante a execução do programa os valores "0" são alterados, ficando, por
> ex:
>
> ("AA",5,"CB",2,"BA",10,"TG",3)
>
> e algumas vezes preciso imprimir o hash ordenado pelo índice e então faço:
>
> foreach $n (sort keys %hash1) {
>
>                        print ...
>
> }
>
> e obenho o resultado esperado, p ex:
>
> AA - 5
> BA - 10
> CB - 2
> TG - 3
>
> Mas o que eu não estou conseguindo fazer é imprimir o hash ordenado
> pelo valor e não pelo índice. Ou seja, precisava da seguinte saída:
>
> CB - 2
> TG - 3
> AA - 5
> BA - 10
>
> Desde já, aagradeço qq ajuda.
>
> []s e obrigado
> Arbex
>
> --
>   Wagner Arbex
> _______________________________________________
> Cascavel-pm mailing list
> Cascavel-pm em pm.org
> http://mail.pm.org/mailman/listinfo/cascavel-pm
>



-- 
Gabriel Vieira
-------------- Próxima Parte ----------
Um anexo em HTML foi limpo...
URL: http://mail.pm.org/pipermail/cascavel-pm/attachments/20070217/400ab44d/attachment-0001.html 


Mais detalhes sobre a lista de discussão Cascavel-pm