[SP-pm] sort

Eden Cardim edencardim em gmail.com
Terça Janeiro 23 10:42:10 PST 2007


On 1/23/07, Thomas Britis <thomas em tcnet.com.br> wrote:
> Senhores,
>
>         Tenho um programa que recebe dados da seguinte forma:
>
> my %bla;
> my $count = 0;
>
> foreach (keys (%ENV)) {
>   $bla[$count] = ({ id => $count,
> nome => $_,
> valor => $ENV{$_}
> });
> $count++;
> }
>
> while (--$count) {
>         print "ID: $bla[$count]->{id}\n";
>         print "Nome: $bla[$count]->{nome}\tValor: $bla[$count]->{valor}\n";
> }
>
> Assim eu jogo os valores que preciso para 'bla'. A minha dúvida é: como
> posso, a partir desse momento, fazer sort dessa hash (bla) de acordo com
> um ou outro campo (id, nome ou valor) ?? É possível?

Não entendi direito quais são seus dados de entrada então vou assumir
que é o conteúdo de %ENV e que você quer ordenar os valores
numericamente preservando a associação com suas respectivas chaves.
Nesse caso, use uma "transformação schwartziana"
(http://en.wikipedia.org/wiki/Schwartzian_transform):

my @sorted =
    map { @$_[0, 1] }
    sort { $a->[1] <=> $b->[1] }
    map { [$_, $_->{$campo} ] }
    keys %ENV;

while( my($key, $value) = each @sorted) {
    print "Nome: $key\tValor: $value, "\n";
}

Se quiser ordenar por chave é simples:

foreach my $key ( sort keys %ENV ) {
    print "Nome: $key\tValor: $ENV{$key}, "\n";
}

Se quiser ordenar por valor, numericamente, use a primeira versão mas
mude 'cmp' para '<=>'. Vale observar que os resultados foram
armazenados num array porque hashes não tem ordenação.

Espero ter ajudado...

-- 
Eden Cardim
Instituto Baiano de Biotecnologia
Núcleo de Biologia Computacional e Gestão de Informações Biotecnológicas
Laboratório de Bioinformática
--
"you seem to think that 'close enough' is close enough...
please learn to be 'literal' around programming."
merlyn - on irc.freenode.net#perl


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