[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