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

Solli Honorio shonorio em gmail.com
Sexta Setembro 12 16:04:27 PDT 2008


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


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