[SP-pm] perl interativo (era: printenv em perl?)

jimmy jimmy.tty at gmail.com
Sat Jun 26 08:49:19 PDT 2010


On Thu, Jun 24, 2010 at 08:06:05PM +0200, Luis Motta Campos wrote:
> On 06/23/2010 08:45 PM, Ronaldo Ferreira de Lima wrote:
> > Seguindo sua sugestão Luis, eu fiz ontem um protótipo pré-beta:
> > 
> > #!/usr/bin/perl
> > 
> > use strict;
> > use warnings;
> > use diagnostics;
> > 
> > my $code;
> > my $prompt = q(Perl> );
> > $prompt = qq(\e[40;32;1m${prompt}\e[0m);
> > do {
> >     print($prompt);
> >     if ($code) {
> > 		if ( substr($code, 0, 7) eq q(perldoc) ) {
> > 			system($code);
> > 		}
> > 		else {
> > 			my @result = eval($code);
> > 			foreach my $result ( @result ) {
> > 				print(qq($result\n));
> > 			}
> > 			warn(qq($@.\n)) if ($@);
> 
> Eu tenho uma pergunta: por que você está forçando contexto de lista e
> capturando o resultado do eval() para depois tentar imprimir?
> 
> Um "Shell Perl" não precisa fazer estas coisas. Você tem alguma razão
> para esta implementação?
Razão eu tenho, mas justificativa, não; esqueci esse "treco" aí, estava
tentando entender o porque disso acontecer:

Perl> print "$_\n" for 1..5
Perl> 1
2
3
4
5
Perl>

e esse trecho de código foi o que sobrou dos testes. A impressão que
tive foi que que o eval permitia a passagem pelo looping antes de
terminar a impressão e que acabava reimprimindo o prompt antes da hora.
Fiquei "encucado" e "matutando" a respeito, mas nem pela definição do
autoflush consegui resolver. Esse código é todo beta e pretendo
testá-lo melhor, não consegui definir bem ainda nem todas as features,
muitas coisas esbarram no meu nível de conhecimento.

Continuando; um exemplo de coisas que me incomodam:

Perl> @INC;
Perl>

viu?
Nada aconteceu, quando o correto seria imprimir:

Perl> Useless use of a variable in void context ...

ou seja, apresentar um comportamento bem mais próximo do interpretador
perl real. 

Na documentação do eval, há menção sobre duas formas diferentes de uso,
que nunca consegui entender realmente qual é essa diferença na prática
fala de tratamento de exceções ... e fala ainda de como manipular
$SIG{__WARN__} para desabilitar warnings (isso se eu entendi direito),
mas é justamente o contrário que procuro; idem com a documentação do
warn (essa cita Carp, mas esse módulo ainda não tentei usar).

Em perllerwarn descobri que haviam várias categorias de warnings, eu
achava que só existia "use warnings;" e mais nada, foi interessante
habitar "tudo" no meu shell (use warnings 'all';):

Perl> $x = 10;
Perl> Global symbol "$x" requires explicit package name at (eval 21)
line 1, <> line 20.
 (#2)

Perl> print $x;
Perl> Global symbol "$x" requires explicit package name at (eval 23)
line 1, <> line 22.
 (#2)

Perl> my $y = 10;
Perl> print $y;
Perl> Global symbol "$y" requires explicit package name at (eval 26)
line 1, <> line 25.
 (#2)
__END__
 
ficou inutilizado!

Pelo que pude ver, a variável $@ armazena somente uma parte dos erros,
preciso descobrir de onde os outros erros provém, para que eu possa
imprimí-los dentro do shell.

> 
> > 		}
> >     }
> > } while ( $code = <> );
> > __END__
> > 
> > Conforme também sugerido, comecei a olhar ontem os Term::* do CORE,
> > talvez e vou fazer alguns testes para ver se consigo criar algo mais
> > usável neste sentido, uma vez que pelo comportamento do eval não
> > consigo habilitar ou desabilitar pragmas por exemplo.
> 
> Dá uma olhada no Safe::World, o código pode te dar idéias de como
> contornar esta limitação do eval():
> 
> http://search.cpan.org/~gmpassos/Safe-World-0.14/lib/Safe/World.pm
Ótimo! Vou olhar sim. Também estou olhando a implementação dos outros
projetos de shell para perl. Acabei até "trombando" uma forma nova de
sair do shell:

Perl> %main:: = ();
Perl> Use of uninitialized value in string eq at /usr/lib/perl5/5.12.1/diagnostics.pm line 499, <> line 27.

Can't locate package IO::Handle for @IO::File::ISA at (eval 28) line 1, <> line
        27 (#4)
    (W syntax) The @ISA array contained the name of another package that
    doesn't seem to exist.

Use of uninitialized value in string eq at /usr/lib/perl5/5.12.1/diagnostics.pm line 499, <> line 27.
Can't locate package IO::Seekable for @IO::File::ISA at (eval 28) line 1, <>
        line 27 (#4)
Use of uninitialized value in string eq at /usr/lib/perl5/5.12.1/diagnostics.pm line 499, <> line 27.
Can't locate package Exporter for @IO::File::ISA at (eval 28) line 1, <> line
        27 (#4)
Use of uninitialized value in string eq at /usr/lib/perl5/5.12.1/diagnostics.pm line 499, <> line 27.
Use of uninitialized value in string eq at /usr/lib/perl5/5.12.1/diagnostics.pm line 499, <> line 27.
Use of uninitialized value in string eq at /usr/lib/perl5/5.12.1/diagnostics.pm line 499, <> line 27.
Use of uninitialized value in string eq at /usr/lib/perl5/5.12.1/diagnostics.pm line 499, <> line 27.
Use of uninitialized value in string eq at /usr/lib/perl5/5.12.1/diagnostics.pm line 499, <> line 27.
Use of uninitialized value in string eq at /usr/lib/perl5/5.12.1/diagnostics.pm line 499, <> line 27.
Segmentation fault
__END__

Nunca imaginei ser possível provocar um desastre desses de forma tão
simples! 

E isso tudo é apenas o comecinho, ainda falta histórico, readline,
interpretação de statements "multiline" ..., para só então se parecer
com um shell.

> 
> > Como você disse (e era o que você queria), eu vou realmente quebrar a cabeça.
> 
> Não só isso: você está conquistando respeito e admiração aqui na lista,
> eu garanto. ;)

Não sei se mais alguém se interessa por shell aqui na lista, mas creio
que um shell também ajudaria quem vai dar cursos introdutórios de perl,
uma vez que o aluno digita e já vê o resultado instantaneamente, sem ter
que criar arquivo e chamar o interpretador, com exemplos desastrosos
como o meu acima, seria fácil converser quem está começando a programar
em perl, a usar "strict" e "warnings", coisa que eu também relutei em
usar no começo por não ter visibilidade disso. 

Já para quem é usuário de linha de comando e/ou sysadmin, iria aproximar
ainda mais o perl das tarefas cotidianas. A exemplo de zsh, que é o
shell mais avançado para unix que conheço, principalmente pela
quantidade de módulos que possui, só que nesse ponto, ninguém tem a
quantidade, qualidade e maturidade dos módulos do CPAN, e isso sem
contar que o interpretador perl sozinho já tem tudo que um sh + awk +
sed + ... tem.

> 
> > Só me complica meus recursos limitados, e depender de lan house para
> > acesso a internet.
> 
> Economicamente falando, eu acho que pode ser mais vantajoso para você
> assinar um provedor de internet com linha discada do que continuar
> usando uma lan-house para acessar a internet... eu arrisco dizer que sai
> mais barato do que acessar duas horas por semana... talvez se você
> disser em que localidade você está, o pessoal da lista possa te ajudar a
> encontrar um provedor de acesso mais em conta. Por favor tome cuidado de
> não revelar seu endereço, lembre-se de que uma lista de discussão é
> pública, e eu tenho certeza de que você não quer ver seu endereço no
> jornal de amanhã... ;)
> 
> Putamplexos
> -- 
> Luis Motta Campos is a DBA,
> Perl Programmer, foodie and photographer.
> 
> _______________________________________________
> SaoPaulo-pm mailing list
> SaoPaulo-pm em pm.org
> http://mail.pm.org/mailman/listinfo/saopaulo-pm

-- 
"Não manejo bem as palavras
Mas manipulo bem as strings."
------------------------------


More information about the SaoPaulo-pm mailing list