[Cascavel-pm] Sort em array de hash.

Alceu R. de Freitas Jr. glasswalk3r em yahoo.com.br
Terça Dezembro 6 11:03:25 PST 2005


--- Rod Za <rodzadra em yahoo.com> escreveu:

> Bom na verdade estou usando um módulo que encontrei
> na net para requisição IPP (Internet Printing
> Protocol). Este módulo me retorna um hash com
> valores que depende do tipo de requisição que eu
> faço.

Virgem maria... mais uma sigla para a sopa
interminável de letrinhas... :-)

> Neste caso específico, estou fazendo uma requisição
> para ter a listagem dos PPD's ( PostScript
> Printer Description) disponíveis em um servidor
> CUPS.

Entendi. Eu vejo três formas de resolver o problema:

1 - Você pega essa requisição do jeito que está e
trata os dados para ter o que precisa.

2 - Você modifica a requisição para receber os dados
do jeito que quer.

3 - Você usa essa requisição mesmo mas guarda os dados
num SGDB qualquer, como o SQLLite.

Eu usaria a 3a solução. A longo prazo, se você
precisar fazer outro tipo de ordenação usando os
relacionamentos existentes entre modelo, marca, etc...
você vai ter que quebrar a cabeça de novo. Se você
guardar isso num banco você faz uma query e retorna o
resultado.

Agora me responda... como é que o CUPS guarda esses
dados? De repente ele já tem uma base de dados que
você pode consultar diretamente ao invés de usar esse
protocolo IPP. Isso evitaria replicar dados. Claro que
você pode perder flexibilidade se o servidor de
impressão for outro.

E essa requisição via IPP? Ela não é flexível o
suficiente para retornar o que você quer receber?

> O problema é que quero "agrupar" estes PPD's
> primeiro por Fabricantes, depois por modelo.
> 
> O hash retornado tem a seguinte forma:
> 
> $VAR1 = {
>           'ppd-make-and-model' => 'Brother HL-720
> Foomatic(recommended)',
>           'ppd-make' => 'Brother',
>           'ppd-name' =>
> 'Brother/HL-720-hl7x0.ppd.gz',
>           'ppd-natural-language' => 'en'
>         };
> O Gilmar Júnior me passou um código (valeu Gilmar)
> mas não consegui saber onde incluí-lo! :(

Basicamente ele faz desreferências e cria um novo
array.
Você vai querer criar uma estrutura por fabricante.
Então você vai receber uma referência a um hash
anônimo por vez (dentro de um loop), certo? Então vai
ficar mais ou menos assim:

$brother_ref = [ { model => 'x',
                   driver => 'y',
                   lang => 'w' },
                  # e assim por diante
               ]

Você faz a desreferência depois acessando cada índice
do $brother_ref:

my @model_list;

foreach my $printer( @{$brother_ref} ) {

    push( @model_list, $printer->{model} );

}

depois você faz

sort(@model_list);

e cria seu array anônimo usando os dados que você
acabou de ordenar. Não sei se o script do Gilmar
funciona, mas ele está bem mais curto do que isso.
Agora, como o nome do modelo da impressora tem espaços
e normalmente é muito longo, não sei se vale a pena
gerar essa lista intermediária. Valeria a pena se você
pudesse acessar a impressora com esse modelo via hash
ao invés de sequencialmente (e fazendo comparações
enquanto isso). Se você gerar um "apelido" curto para
a impressora, e que não se repita (como um número
sequencial) você poderia fazer isso. Melhor ainda,
você poderia usar esse número sequencial como uma
posição de array (mais rápido ainda).

Dê uma olhada na documentação do sort. Eu acredito que
seja possível você criar um função e usar as variáveis
$a e $b como índices do array anônimo, e usando esses
índices você faz a desreferência de cada modelo de
impressora e a comparação entre as duas, retornando
-1, 1 ou 0. Digite "perl cmp operator" no Google e
pegue o primeiro link que aparecer para ter mais
detalhes. :-)

> Eu posso até ver se modifico o módulo IPP mas o
> problema é que já estava trabalhando com ele em
> outras partes do sistema... :(

Sinal de que você não está fazendo uma abstração
legal, certo? Você deveria poder mudar a origem dos
dados sem quebrar sua interface.

Eu acho que estou mais atrapalhando do que ajudando no
final das contas. :-(

[]'s




Alceu Rodrigues de Freitas Junior
--------------------------------------
glasswalk3r em yahoo.com.br
http://www.imortais.cjb.net
-----------------------------------------------------------------------
A well-used door needs no oil on its hinges.
A swift-flowing stream does not grow stagnant.
Neither sound nor thoughts can travel through a vacuum.
Software rots if not used.
These are great mysteries -- The Tao Of Programming, 5.1


	



	
		
_______________________________________________________ 
Yahoo! doce lar. Faça do Yahoo! sua homepage. 
http://br.yahoo.com/homepageset.html 



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