[Cascavel-pm] Script Perl para ler arquivo PHP

Pedro César pedrocesar em tecdom.com.br
Quinta Abril 9 11:32:30 PDT 2009


Breno muito obrigado pela resposta, é que como já programo em PHP, achei que
podia pular alguns materiais basicos, ;-), Mas to vendo que Perl tem algumas
particularidades.

Só para deixar claro, não sou programador, sou administrador de redes, uso
liguagens só para criar scipts e alguns sistemas simples. Nada profissional.

Mas vou reler essa sua mensagem com calma, e vou reler o material
introdutorio.

Quanto mais a gente estuda mais a gente tem duvidas, entao me aguardem,
rsrsrs

Abraço


Em 09/04/09, breno <breno em rio.pm.org> escreveu:
>
> 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
> >
> _______________________________________________
> 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
-------------- Próxima Parte ----------
Um anexo em HTML foi limpo...
URL: <http://mail.pm.org/pipermail/cascavel-pm/attachments/20090409/561f4800/attachment-0001.html>


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