[SP-pm] sort

Luis Motta Campos luismottacampos em yahoo.co.uk
Terça Janeiro 23 11:03:00 PST 2007


On Jan 23, 2007, at 7:02 PM, Thomas Britis wrote:
>
> 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";
> }

   Em três minutos olhando o seu código, eu fiquei me perguntando por  
que não usar assim:

   map { print 'ID: ' . ++$count . "\nNome: $_\tValor: $ENV{$_}\n" }  
keys %ENV;

   Que vai te dar exatamente o mesmo efeito sem nenhuma das  
estruturas desajeitadas que você está criando e destruindo sem  
qualquer necessidade...

> 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?

   Se você quer ordenar (eu vou assumir alfabéticamente onde os dados  
forem alfanuméricos, e matemáticamente onde forem dados numéricos),  
então pode começar a valer á pena construir hashes. Mas use a função  
sort(), de acordo com o manual, para não dar "xabú":

   # 1. Ordenar numéricamente pelo campo "ID":
   map { print 'ID: ' . ++$count . "\nNome: $_\tValor: $ENV{$_}\n" }  
keys %ENV;

   # 2. Ordenar alfabéticamente pelo campo "Nome":
   map { print $_->{STR} }
     sort( { $a->{NOME} cmp $b->{NOME} }
       map +{ NOME => $_,
              STR  => 'ID: '.++$count."\nNome: $_\tValor: $ENV{$_}\n"
       }, keys %ENV );

   # 3. Ordenar alfabéticamente pelo campo "Nome":
   map { print $_->{STR} }
     sort( { $a->{VALOR} cmp $b->{VALOR} }
       map +{ VALOR => $ENV{$_},
              STR  => 'ID: '.++$count."\nNome: $_\tValor: $ENV{$_}\n"
       }, keys %ENV );

> Normalmente quando preciso fazer isso, gero uma hash para cada campo e
> depois no fim gero a hash final, mas acredito que deva haver alguma
> outra forma.

   Assim, sem gerar hashes, funciona muito bem...
   Espero que você se divirta tanto quanto eu me diverti.
   Putamplexos!
--
Luis Motta Campos is software engineer,
perl fanatic evangelist, and amateur {cook, photographer}




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