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

Samir Cury rimasy em gmail.com
Terça Setembro 16 08:31:16 PDT 2008


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

outra, tentei usar esse codigo e nao tive muito sucesso :

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

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
>
-------------- Próxima Parte ----------
Um anexo em HTML foi limpo...
URL: <http://mail.pm.org/pipermail/rio-pm/attachments/20080916/d09ee043/attachment.html>


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