[Cascavel-pm] Script Perl para ler arquivo PHP

Fernando fernandocorrea em gmail.com
Quinta Abril 9 10:23:18 PDT 2009


Muito bom email... Principalmente a parte dos herculoides!!!

Just another perl hacker

Em 09/04/2009, às 13:52, breno <breno em rio.pm.org> escreveu:
!#x000a
> Oi Pedro, bem vindo!
>
> Recomendo vivamente que vc siga a recomendação do Daniel e aprenda  
> um
> pouco mais sobre o básico da linguagem com a excelente  
> documentação do
> Perl.
>
> Sobre suas dúvidas, bom, como vc deve ter percebido pela resposta do
> Otávio, em Perl existe sempre mais de uma maneira de se fazer as
> coisas! A grande questão é que, enquanto uma ou outra forma são
> simples diferenças de "sotaque", outras são realmente mais
> recomendadas, por diversos motivos.
>
> A primeira coisa que vc deveria se acostumar a fazer é formular
> perguntas que nos ajudem a te ajudar. Por exemplo, vc disse:
>
> "to tentando criar um script que leia um arquivo PHP que tenho no  
> servidor"
>
> , e isso levou o Otávio a crer que o arquivo era local, e não remot 
> o.
> Depois, vc disse:
>
> "Porem o codigo nao exibe o conteudo do arquivo PHP"
>
> , nesse ponto o melhor a fazer é dizer algo como:  "estava esperando 
>  X
> e aconteceu Y". Dizer "não funcionou" não nos diz muita coisa =)
>
> Por exemplo, se você ativa o pragma strict ("use strict"), então tod 
> as
> as suas variáveis precisam ser pré-declaradas! Como? Colocando "my"  
> na
> frente delas antes de usá-las pela primeira vez (e lá se foi uma das
> suas dúvidas, espero! :)
>
> Aí seguem duas dicas importantes:
>
> 1) Seus programas devem *sempre* começar com:
> use strict;
> use warnings;
>
> exatamente como o Otávio respondeu. (alguns desenvolvedores gostam de
> tirar o "warnings" qdo o sistema entra em produção, mas não faça  
> isso
> :-)
>
> 2) Pra vc que está começando, o Perl oferece um outro pragma muito
> interessante, e recomendo que use:
> use diagnostics;
>
> coloque esse pragma logo abaixo do "use warnings", e o Perl te dará
> dicas sobre o que ele acha que está acontecendo e como solucionar o
> problema. Por exemplo, rodando o seu programa com esses três pragmas
> ativos, obtemos a saida:
>
> -----------------------------8<-----------------------------
> Global symbol "$file" requires explicit package name at pedro.pl  
> line 6.
> Global symbol "$file" requires explicit package name at pedro.pl  
> line 7.
> Global symbol "@lines" requires explicit package name pedro ex.pl  
> line 8.
> Global symbol "@lines" requires explicit package name at pedro.pl  
> line 11.
> Execution of pedro.pl aborted due to compilation errors (#1)
>    (F) You've said "use strict" or "use strict vars", which indicates
>    that all variables must either be lexically scoped (using "my" or  
> "state"),
>    declared beforehand using "our", or explicitly qualified to say
>    which package the global variable is in (using "::").
>
> Uncaught exception from user code:
>    Global symbol "$file" requires explicit package name at pedro.pl  
> line 6.
> Global symbol "$file" requires explicit package name at pedro.pl  
> line 7.
> Global symbol "@lines" requires explicit package name at pedro.pl  
> line 8.
> Global symbol "@lines" requires explicit package name at pedro.pl  
> line 11.
> Execution of pedro.pl aborted due to compilation errors.
> at ex.pl line 11
> ----------------------------->8-----------------------------
>
> Viu a dica ali no meio? Pois é :-)
>
>
> Outra coisa que você reparou foi que o Otávio usou o comando "open"
> com 3 argumentos, em vez de dois. Essa é a forma recomendada de usar 
>  o
> open, pois nela vc diz explicitamente qual o modo de abertura
> (leitura, escrita, etc), e evita código potencialmente inseguro. Isso
> porque, usando o open com dois argumentos apenas, você não consegue
> forçar o modo desejado. Afinal, o open aceita nessa forma que você
> especifique o modo DENTRO da variável, como $file =
> '>meu_arquivo.txt'. Se alguém conseguir editar o conteúdo da  
> variável,
> pode causar muitos problemas!
>
> Mas ele fez mais do que isso... se vc reparar, ele usou como handle de
> arquivo uma variável, e não uma palavra em maiúsculas (bareword).  
> Esse
> é o procedimento recomendado também, especialmente pq barewords são
> globais do pacote (em vez de léxicas, como as variáveis declaradas c 
> om
> "my") e podem causar muitos problemas inesperados (especialmente se vc
> acidentalmente usar a mesma bareword para abrir diferentes arquivos).
>
> Para mais informações:  perldoc -f open
>
> Outra coisa que ele fez foi usar operadores "quote-like" em vez dos
> quotes em si. Em Perl, você pode especificar um bloco entre aspas
> simples como q{}, entre aspas duplas como qq{}. Isso é particularmen 
> te
> útil para evitar precisar escapar caracteres especiais. Por exemplo,
> suponha que vc queira armazenar em $var o conteúdo:
>
>     %_@'''0283',z''''''..'.'
>
> Você teria que fazer algo como:
>
> my $var = '%_@\'\'\'0283\',z\'\'\'\'\'\'..\'.\'';
>
> o que é no mínimo confuso. Que tal assim:
>
> my $var = q{%_@'''0283',z''''''..'.'};
>
> Bem mais fácil, né? O perl faz o que vc quer e não deixa os "plique 
> s"
> internos interferirem no seu comando :-)
>
> Usar q{} e qq{} é especialmente útil ao fazer one-liners, evitando q 
> ue
> os quotes sejam interpolados pela shell. Dentro do código, a menos q 
> ue
> você tenha um bom motivo como o acima, é só uma questão de  
> preferência
> mesmo - então fazer '>' ou q{>} não importa. Existe um outro operado 
> r,
> o qw(), que separa elementos de listas, de modo que em vez de vc
> escrever assim:
>
>   my @herculoids = ( 'igoo', 'tundro', 'zok', 'gloop', 'gleep' );
>
> pode escrever assim:
>
>   my @herculoids = qw( igoo tundro zok gloop gleep );
>
> que costuma ser muito mais fácil de escrever, e de ler.
>
> Outra coisa que ele fez diferente foi ler o arquivo uma linha por vez,
> que é mais eficiente do que ler tudo de uma vez pra dentro de um
> array, e é o procedimento recomendado - especialmente para arquivos
> grandes. Ele usou a variável de contexto $_, mas vamos deixar isso p 
> ra
> depois que você tiver se acostumado com o Perl :-)
>
> Finalmente, como nota pessoal, em Perl a maioria dos parêntesis são
> opcionais e devem ser usados apenas para evitar ambiguidade. Assim, em
> vez de fazer:
>
>   open (my $FH, '<', $filename) or die $!;
>   ...
>   print ($linha);
>   ...
>   close($FH);
>
> você pode fazer:
>
>   open my $FH, '<', $filename or die $!;
>   ...
>   print $linha;
>   ...
>   close $FH;
>
> No caso do open, muita gente (inclusive eu) gosta de colocar o "or" na
> linha de baixo, com uma leve identação. Assim:
>
>   open my $FH, '<', $filename
>       or die "erro abrindo arquivo: $!\n";
>
> Ou você pode usar o pragma "autodie", mas isso também é outra  
> história :-)
>
>
> Enfim, já me alonguei muito. A moral da história é:
>
> Experimente as coisas do jeito que o Otávio disse  (otavio++)
>
> Leia a documentação indicada pelo Daniel  (mantovani++)
>
>
> E qq coisa, é só perguntar!
>
> []s
>
> -b
>
> 2009/4/8 Pedro César <pedrocesar em tecdom.com.br>:
>> Puxa, e eu tava achando massa meu código, rsrsrs, é um de meus pri 
>> meiros.
>>
>> Vê só, já que você me deu a "brecha" vou pedir duas coisas, a  
>> primeira é
>> comentar o código que você me fez, basicamente não entendi por exe 
>> mplo o
>> "my" na frente do $file e o q{<} no open.
>>
>> A segunda é que gostaria que me mostrasse como usar o modulo suger 
>> ido, pois
>> o acesso é remoto mesmo, se puder fazer o código e comentar, me aj 
>> uda muito.
>>
>> Muitíssimo obrigado desde ja.
>>
>> 2009/4/8 Otávio Fernandes <otaviof em gmail.com>
>>>
>>> Olá Pedro,
>>>
>>> Estou vendo, realmente, que você está começando com Perl. Bom,
>>> primeira coisa, você está passando uma URI para acessar o arquiv 
>>> o...
>>> acredito que você está rodando o script no mesmo servidor onde  
>>> este
>>> arquivo se encontra, então, você tem que passar path para acessar
>>> diretamente, exemplo: "my $file = q{/var/tmp/arquivo.php};". O  
>>> script
>>> ficaria assim (com algumas melhorias):
>>>
>>> #!/usr/bin/env perl
>>>
>>> use strict;
>>> use warnings;
>>>
>>> my $file = q{/var/tmp/arquivo.php};
>>>
>>> open( my $FH, q{<}, $file ) or die $!;
>>> while( <$FH> ) {
>>>    print;
>>> }
>>> close( $FH );
>>>
>>> __END__
>>>
>>> Caso você queria acessar este arquivo remoto, via protocolo HTTP 
>>> , você
>>> pode usar o módulo LWP (por exemplo).
>>>
>>> Dúvidas? Pergunta ai.
>>>
>>> um abraço,
>>>
>>> --
>>> Otávio Fernandes <otaviof at gmail.com>
>>> http://otaviof.blogspot.com/
>>> _______________________________________________
>>> Cascavel-pm mailing list
>>> Cascavel-pm em pm.org
>>> http://mail.pm.org/mailman/listinfo/cascavel-pm
>>
>>
>>
>> --
>> Pedro César
>> Analista de Suporte
>> Microsoft Certified Professional - MCP
>> Blog: www.tecdom.com.br/blog
>> Fone: 82-9317-8802
>> msn: pedrocesar em tecdom.com.br
>> Registered Linux User #282860
>>
>>
>> "Autoridades são alguns,
>> e só por algun tempo.
>> Enquanto cidadãos somos todos nós,
>> e durante toda a vida".
>> Prof. Hugo de Britto Machado
>>
>>
>>
>> _______________________________________________
>> Cascavel-pm mailing list
>> Cascavel-pm em pm.org
>> http://mail.pm.org/mailman/listinfo/cascavel-pm
>>
> _______________________________________________
> Cascavel-pm mailing list
> Cascavel-pm em pm.org
> http://mail.pm.org/mailman/listinfo/cascavel-pm


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