[Cascavel-pm] Script Perl para ler arquivo PHP

breno breno em rio.pm.org
Quinta Abril 9 09:52:47 PDT 2009


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 remoto.
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 todas
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 com
"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 é particularmente
ú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 "pliques"
internos interferirem no seu comando :-)

Usar q{} e qq{} é especialmente útil ao fazer one-liners, evitando que
os quotes sejam interpolados pela shell. Dentro do código, a menos que
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 operador,
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 pra
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 primeiros.
>
> 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 exemplo o
> "my" na frente do $file e o q{<} no open.
>
> A segunda é que gostaria que me mostrasse como usar o modulo sugerido, pois
> o acesso é remoto mesmo, se puder fazer o código e comentar, me ajuda 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 arquivo...
>> 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
>


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