[Cascavel-pm] Sort em array de hash.

Rod Za rodzadra em yahoo.com
Quarta Dezembro 7 05:57:12 PST 2005


--- "Alceu R. de Freitas Jr." <glasswalk3r em yahoo.com.br> wrote:

[....] 
> 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.

Então, por enquanto estou utilizando a 1a. opção. A 2a. é possível também, mas vou usá-la como
último recurso e a 3a. tem um problema no caso de alguém incluir um novo driver PPD que não seria
reconhecido automaticamente. Logicamente este último poderia ser contornado se eu comparasse toda
vez o número de PPDs com o número de registros de meu BD, mas não garantiria que o BD estaria
atualizado - neste caso eu teria q fazer uma comparação a cada vez de todos os dados. :/

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

Na verdade esses PPDs são arquivos textos q podem ou não estar comprimidos com GZIP. Eu poderia
criar um parse facilmente para fazer uma varedura nestes arquivos e montar uma estrutura melhor,
mas só se a minha aplicação estivesse rodando na própria máquina em que se encontra o CUPS. Eu
estou justamente usando o protocolo IPP para pegar estas informações para correr disso. Assim
posso ter uma máquina exclusiva para o CUPS enquanto as áreas administrativa e de usuários (CGI's)
podem ficar em uma outra servidora web.


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

Creio que sim, ela me retorna (quase que) perfeitamente o que preciso.  O único problema está
sendo colocar em order crescente o nome dos modelos de impressoras que será apresentado na área
administrativa.

[....]
> > 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).

Vou ver o que consigo seguindo suas idéias :)


> 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. :-)

Valeu. :)


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

Na realidade não sei não. A verdade é que em uma parte do sistema eu recebo um outro HASH do
módulo e trabalho nele. O formato é praticamente o mesmo, só que não tenho a necessidade de
ordenar nada! :)
 
> Eu acho que estou mais atrapalhando do que ajudando no
> final das contas. :-(

Tá nada, tá é tendo um saco bem grande para me ajudar e por isso eu te agradeço muito! :)


Valeu mais uma vez. 

[]'s


Rodrigo.



		
__________________________________________ 
Yahoo! DSL – Something to write home about. 
Just $16.99/mo. or less. 
dsl.yahoo.com 



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