[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