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

Solli Honorio shonorio em gmail.com
Terça Setembro 16 15:34:35 PDT 2008


2008/9/16 Samir Cury <rimasy em gmail.com>

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


Samir não querendo ser chato mas já sendo, não é correto você dizer que isto
'como se fosse um array'. Isto não é um 'tipo de array', é um processo de
abrir um recurso e efeutar uma leitura sequêncial deste.

Esta pequena diferença de conceito pode ser a diferença entre utilizar
corretamente/ou não os recursos da linguagem, sendo algumas:

* o file handle não tem índice, então você não pode fazer algo do tipo
<$my_file_handle>[-1] para ler a última linha do arquivo;
* quando falamos de file handle associamos automaticamente em 'while' porquê
ele trabalha com o buffer (como o Wendel já informou);
* quando falamos de array associamos automaticamente em for/foreach. o 'for'
exige já ter conhecimento do tamanho da lista, então se você utilizar 'for'
para um file handle, ele vai ter que ler todo o arquivo;

Como eu disse, é importante você utilizar os termos corretos para as
tecnologia correta.




>
>
> <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
>>
>
>
> _______________________________________________
> Rio-pm mailing list
> Rio-pm em pm.org
> http://mail.pm.org/mailman/listinfo/rio-pm
>



-- 
"o animal satisfeito dorme". - Guimarães Rosa
-------------- Próxima Parte ----------
Um anexo em HTML foi limpo...
URL: <http://mail.pm.org/pipermail/rio-pm/attachments/20080916/2d5cd2c7/attachment-0001.html>


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