[Cascavel-pm] Sort em array de hash.

Rod Za rodzadra em yahoo.com
Quinta Dezembro 8 09:49:11 PST 2005


--- "Alceu R. de Freitas Jr." <glasswalk3r em yahoo.com.br> wrote:
> Você está querendo correr do problema mas ele está
> correndo atrás de você até o servidor web. Se o IPP
> não está sendo flexível, porque não criar um parse
> desses arquivos, instalar um SGBD na máquina do CUPS e
> fazer queries diretamente de lá? Você pode fazer as
> atualizações depois via CRONTAB.

Acho que eu estava com problema de BIOS*, hehehehe! :)

Resolvi dar uma esfriada na cabeça, jogando Unreal Tournamente 2004 por 2 dias seguidos e resolvi
o problema. Prestei a atenção no que vc e o Gilmar tinham me passado e vi que o problema estava no
modo em como estava tratando [a|o] HASH que recebia do módulo! 

Resolvi transformá-la em uma estrutura um pouco diferente em vez de um ARRAY de HASH fiz o
contrário :) e ficou perfeito agora.

Substitui o código:

<perl>
sub show_ppd(){
my $maker = shift;
my $HASH;
my $i;

foreach my $r ( doIPPrequest( "http://localhost:631",
                    'type' => CUPS_GET_PPDS,
                    'attr' => { 'ppd-make' => { 'type'  => TAG_KEYWORD,
                                                'value' => $maker,
                                              },
                        }
        )
){
  next if($r->{'ppd-make'} eq undef);
  next if($r->{'ppd-make'} ne $maker and (defined $maker));
  $i->{$r->{'ppd-make'}} = 0 if(!defined($i->{$r->{'ppd-make'}}));
  $HASH->{ $r->{'ppd-make'} }[$i->{$r->{'ppd-make'}}] = 
               { ppd_model => $r->{'ppd-make-and-model'   },
                 ppd_driver => $r->{'ppd-name'            },
                 ppd_lang   => $r->{'ppd-natural-language'} 
               };

  $i->{$r->{'ppd-make'}}++;
}
return $HASH;
}
</perl>
 
por:

<perl>
sub show_ppd(){

my %HASH;
my $i;

foreach my $r ( doPPDrequest( "http://localhost:631",
                    'type' => CUPS_GET_PPDS,
                    'attr' => { 'ppd-make' => { 'type'  => TAG_TEXT,
                                                'value' => $maker,
                                              },
                        }
        )
){
        next if($r->{'ppd-make'} eq undef);
        next if($r->{'ppd-make'} ne $maker and (defined $maker));
        $i->{$r->{'ppd-make'}} = 0 if(!defined($i->{$r->{'ppd-make'}}));
        %HASH->{ $r->{'ppd-make'} }[$i->{$r->{'ppd-make'}}] = [                                   
                                         $r->{'ppd-make-and-model'   } ,
                                         $r->{'ppd-name'          },
                                         $r->{'ppd-natural-language'} 
                                                              ];
$i->{$r->{'ppd-make'}}++;
}

return %HASH;

}
</perl>

E depois apliquei a função sort, conforme vcs sugeriram:

<perl>

my %a=show_ppd();

@out = sort { $a->[0] cmp $b->[0] } @{%a->{$maker}};

</perl>

 
> Que é isso! Está divertido! :-D

Valeu pelas idéias! :)

Um grande abraço,

Rodrigo.

ps: *para quem não sabe BIOS = "Burro Ignorante Operando o Sistema"! (no caso eu mesmo!) :)

__________________________________________________
Do You Yahoo!?
Tired of spam?  Yahoo! Mail has the best spam protection around 
http://mail.yahoo.com 


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