[Rio-pm] Hashes que referenciam (arrays variáveis?)

Samir Cury rimasy em gmail.com
Terça Setembro 16 10:41:01 PDT 2008


faltava a virgula pra separar o FH do STDOUT, já está rodando

agora, esse FH eu posso usar como se fosse um array, só que a vantagem é que
eu uso partes em partes na memória, ao invés de tudo de uma vez (diferente
de arrays), certo?


<code>
open my $list_in_file , q[cat list.txt | ];
print <$list_in_file>;
</code>


2008/9/16 Alexei Znamensky <russoz em gmail.com>

> É, depois que eu mandei eu vi, mas achei que você fosse dizer alguma coisa
> ;-)
>
> 2008/9/16 Solli Honorio <shonorio em gmail.com>
>
>
>> 2008/9/16 Alexei Znamensky <russoz em gmail.com>
>>
>>>
>>>
>>> 2008/9/16 Samir Cury <rimasy em gmail.com>
>>>
>>>> Então pessoal,
>>>>
>>>> Hoje tentei por em prática a dica do Solli, mas esbarrei em algumas
>>>> coisas, a explicação resumão foi bem esclarescedora, mas me confirmem uma
>>>> coisa:
>>>>
>>>> quando eu dou por exemplo (nem sei se é possível, mas pelo visto sim)
>>>>
>>>> foreach $i(<$cmd_ls>) { code; }
>>>>
>>>> Eu não estaria ocupando memória tanto quanto usando um array porque eu
>>>> estou lendo de um arquivo temporário que seria o STDOUT do comando ??
>>>>
>>>
>>> Não porque debaixo dos panos o perl tá fazendo um fork, abrindo um
>>> processo novo, e delegando a comunicação entre processos para o sistema
>>> operacional - do mesmo jeito que funciona quando se usa um pipe na linha de
>>> comando. O pipe NÃO joga todo o stdout para a memória, ele vai lendo aos
>>> poucos em buffers dentro do kernel (naquele esquema producer/consumer, se
>>> você teve isso na faculdade ;-)
>>>
>>>
>>>> outra, tentei usar esse codigo e nao tive muito sucesso :
>>>>
>>>> open my $list_in_file q[cat list.txt | ];
>>>> print <$list_in_file>;
>>>>
>>>
>>> tente qx[ cat list | ]
>>>
>>
>> Na verdade não precisa do 'qx' neste caso, é só ele descobrir onde  o
>> código dele está errada ;) !
>>
>>
>>>
>>>
>>>>
>>>>
>>>> não entendi muito bem, mas segui o modelo do solli
>>>>
>>>> valeu!
>>>>
>>>>
>>>>
>>>>
>>>> 2008/9/12 Solli Honorio <shonorio em gmail.com>
>>>>
>>>>> 2008/9/12 Samir Cury <rimasy em gmail.com>
>>>>>
>>>>>> Beleza Solli, só uma coisa
>>>>>>
>>>>>
>>>>> Só explico se tiver um shonorio++ :) !!!
>>>>>
>>>>>
>>>>>>
>>>>>> 2008/9/12 Solli Honorio <shonorio em gmail.com>
>>>>>>
>>>>>>> Grande pequeno gafanhoto Samir, este teu código está estranho... mas
>>>>>>> vou pular estar parte e  vamos para o trabalho verdadeiro.. utilize o
>>>>>>> 'File::Find', a documentação é boa e tem uma caminhão de outros exemplos na
>>>>>>> internet !!!
>>>>>>>
>>>>>>> Agora sobre o código :
>>>>>>>
>>>>>>>
>>>>>>> 2008/9/12 Samir Cury <rimasy em gmail.com>
>>>>>>>
>>>>>>>> Então galera, meu problema é o seguinte, relacionar uma árvore de
>>>>>>>> diretórios (no final cada arquivo) ao seu full path que seria a chave do
>>>>>>>> hash, o conteúdo seria o tamanho.
>>>>>>>>
>>>>>>>> Beleza, o du -ha me ajudaria nisso, mas ele não funciona no fs que
>>>>>>>> estou usando, apenas ls -laR
>>>>>>>>
>>>>>>>> Então o que pensei:
>>>>>>>>
>>>>>>>> #!/usr/bin/perl
>>>>>>>> use diagnostics;
>>>>>>>>
>>>>>>>> @list=`ls -lhR /pnfs/`;
>>>>>>>>
>>>>>>>
>>>>>>> evite isto, pelos motivos :
>>>>>>> 1o. é difícil de ler, prefira qx/ls.../;
>>>>>>> 2o. não coloque o retorno todo numa array, você está consumindo muito
>>>>>>> recurso de memoria, prefira:
>>>>>>> <code>
>>>>>>> open my $cmd_ls q[ls -lhR /pnfs/ |]
>>>>>>>
>>>>>>
>>>>>>
>>>>>> essa sintaxe eu não conhecia       q[ls -lhR /pnfs/ |]         seria
>>>>>> "o mesmo" que `ls -lhR /pnfs/`, olhando um pouco do link
>>>>>>
>>>>>
>>>>> Não exatamente, o mesmo que `comando` é o qx[].
>>>>>
>>>>>
>>>>>>
>>>>>> http://perldoc.perl.org/perlop.html#Regexp-Quote-Like-Operators
>>>>>>
>>>>>> deu pra entender o q[ ] , mas e o pipe??
>>>>>>
>>>>>
>>>>> Cara isto é uma captura de pipe, neste caso só STDOUT (
>>>>> http://perldoc.perl.org/perlipc.html#Using-open()-for-IPC<http://perldoc.perl.org/perlipc.html#Using-open%28%29-for-IPC>).
>>>>> Outras fontes é o perldoc IPC::Open2 e perldoc IPC::Open3
>>>>>
>>>>>
>>>>>>
>>>>>>
>>>>>> outra, porque referenciar a variável que guardou o arquivo como
>>>>>> <$cmd_ls> ? para ser tratado como um array ou algo assim?
>>>>>>
>>>>>> valeu!
>>>>>>
>>>>>
>>>>> ... cara dê uma olhada com carinho no 'perldoc -f open', mas vou
>>>>> explicar com menos detalhe uma coisa.
>>>>>
>>>>> o 'open' recebe um FILEHANDLE, e você deve fazer algo assim :
>>>>> open FH, '<', '/file';
>>>>> este é o exemplo padrão e que tudo mundo utiliza, só que o FILEHANDLE é
>>>>> uma 'variável' glogal e pode trazer confusões se você tiver um script que
>>>>> abra vários arquivos com o mesmo filehandle. Para resolver este problema em
>>>>> potencial você pode declarar uma variável, tipo:
>>>>> open my $fh, '<', '/file';
>>>>> com isto você cria uma variável no escopo local... e que ninguém nos
>>>>> ouça, mas com isto vc nem precisa efetuar o close ($fh), pois quando você
>>>>> sair do escopo a variável '$fh' vai para o espaço !!!
>>>>>
>>>>> Então, se $fh é uma variável contendo um FILEHANDLE, eu só consigo ler
>>>>> o conteúdo através do operador diamente '<>', correto ?! Então não estou
>>>>> lendo um array, estou lendo o conteúdo do arquivo linha a linha, que neste
>>>>> caso é o STDOUT do pipe do comando !
>>>>>
>>>>>
>>>>>>
>>>>>>
>>>>>>> while (my $linha = <$cmd_ls> ) {
>>>>>>>   ...
>>>>>>> }
>>>>>>> </code>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>>
>>>>>>>> foreach my $i(@list){
>>>>>>>> #acha os diretórios que conterão os arquivos, e filtra seu nome para
>>>>>>>> associar aos
>>>>>>>> #arquivos
>>>>>>>>         if ($i =~ /\:/)
>>>>>>>>                 {
>>>>>>>>                 chomp $i;
>>>>>>>>                 %directories{$i}=
>>>>>>>>                 }
>>>>>>>>         }
>>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> Bom aqui tem uma problema grave e que vai gerar uma confusão boa,
>>>>>>> pelo seguinte:
>>>>>>> 1o. Você precisa criar dois fluxo de tratamento, um quando é o nome
>>>>>>> do diretório e outro quando é o nome do arquivo. E isto não é tão trivial
>>>>>>> fazer isto de maneira robusta.
>>>>>>> 2o. a tua regex vai quebrar fácil se alguém criar um arquivo com nome
>>>>>>> ':'.
>>>>>>>
>>>>>>> Então cara eu sugiro utilizar o File::Find !
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>> e cada por exemplo %directories{/pnfs/home/users/samir}
>>>>>>>> referenciaria um array dos arquivos que ele contém
>>>>>>>>
>>>>>>>> qualquer sugestão de como fazer o nome do array variar a cada
>>>>>>>> iteração é bem-vinda, ou talvez uma maneira mais inteligente de resolver o
>>>>>>>> problema, sempre tem, mas às vezes não enxergo
>>>>>>>>
>>>>>>>> _______________________________________________
>>>>>>>> Rio-pm mailing list
>>>>>>>> Rio-pm em pm.org
>>>>>>>> http://mail.pm.org/mailman/listinfo/rio-pm
>>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> --
>>>>>>> "o animal satisfeito dorme". - Guimarães Rosa
>>>>>>>
>>>>>>> _______________________________________________
>>>>>>> Rio-pm mailing list
>>>>>>> Rio-pm em pm.org
>>>>>>> http://mail.pm.org/mailman/listinfo/rio-pm
>>>>>>>
>>>>>>
>>>>>>
>>>>>> _______________________________________________
>>>>>> Rio-pm mailing list
>>>>>> Rio-pm em pm.org
>>>>>> http://mail.pm.org/mailman/listinfo/rio-pm
>>>>>>
>>>>>
>>>>>
>>>>>
>>>>> --
>>>>> "o animal satisfeito dorme". - Guimarães Rosa
>>>>>
>>>>> _______________________________________________
>>>>> Rio-pm mailing list
>>>>> Rio-pm em pm.org
>>>>> http://mail.pm.org/mailman/listinfo/rio-pm
>>>>>
>>>>
>>>>
>>>> _______________________________________________
>>>> Rio-pm mailing list
>>>> Rio-pm em pm.org
>>>> http://mail.pm.org/mailman/listinfo/rio-pm
>>>>
>>>
>>>
>>>
>>> --
>>> Alexei Znamensky [russoz_gmail_com] [russoz.wordpress.com] [
>>> www.flickr.com/photos/alexeiz]
>>> "Though we live in trying times, we're the ones who have to try"
>>>
>>> _______________________________________________
>>> Rio-pm mailing list
>>> Rio-pm em pm.org
>>> http://mail.pm.org/mailman/listinfo/rio-pm
>>>
>>
>>
>>
>> --
>> "o animal satisfeito dorme". - Guimarães Rosa
>>
>> _______________________________________________
>> Rio-pm mailing list
>> Rio-pm em pm.org
>> http://mail.pm.org/mailman/listinfo/rio-pm
>>
>
>
>
> --
> Alexei Znamensky [russoz_gmail_com] [russoz.wordpress.com] [
> www.flickr.com/photos/alexeiz]
> "Though we live in trying times, we're the ones who have to try"
>
> _______________________________________________
> Rio-pm mailing list
> Rio-pm em pm.org
> http://mail.pm.org/mailman/listinfo/rio-pm
>
-------------- Próxima Parte ----------
Um anexo em HTML foi limpo...
URL: <http://mail.pm.org/pipermail/rio-pm/attachments/20080916/4e72727c/attachment.html>


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