[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