[Triangulo-pm] [Perl 5 - Básico] #3 Estrito e Cuidadoso
Adriano Ferreira
a.r.ferreira em gmail.com
Domingo Agosto 2 09:10:54 PDT 2009
[Perl 5 - Básico] #3 Estrito e Cuidadoso
A linguagem Perl foi propositalmente projetada para servir tanto a
programadores experientes quanto a iniciantes. Esta flexibilidade veio
ao longo de anos de desenvolvimento. As práticas da linguagem mudaram
junto com a mudança de hábitos de seus programadores.
Uma destas práticas para se ter em mente logo ao iniciar o aprendizado
de Perl é: sempre coloque no início de seus programas os comandos:
use strict;
use warnings;
Por quê? Porque em seu modo *default*, Perl é extremamente complacente
e compatível com a programação de anos atrás. Estes comandos ativam
uma série de checagens que ajudam iniciantes e quaisquer outros tipos
de programadores a seguir confiantes escrevendo programas Perl de
qualquer tamanho.
Sem "strict", muitas coisas surpreendentes podem acontecer: variáveis
ganham vida automaticamente (quer você queira ou não)
$count++;
vai automaticamente trazer a variável $count à vida e o incremento vai
passar o seu valor inicial de "undef" (que é 0 do ponto de vista
numérico) para 1.
O grande problema com esta capacidade é que estas variáveis surgidas
do nada podem ter o mesmo nome que outras que ocorrem em outros pontos
do programa. O pior é que elas serão as mesmas porque vão
compartilhar o mesmo espaço.
Outro problema comum são erros de digitação, que podem demorar para
ser percebidos e levar a *bugs* difíceis de encontrar. Por exemplo, se
em um pedaço razoavelmente longo de código, você se refere a $cont
quando queria dizer $count e o Perl fica quieto (porque você deve saber
o que está fazendo).
Com "use strict", as coisas são diferentes:
$count++
leva ao erro
Global symbol "$count" requires explicit package name
[Símbolo global "$count" requer nome de pacote explícito]
O uso correto é tornar a variável local ao escopo onde ela precisa
existir com uma declaração "my":
my $count;
...
$count++;
Sem "warnings", algumas situações suspeitas passam sem chamar
atenção. Por exemplo,
my $count = 'a';
$count += 1;
converte o string 'a' silenciosamente para 0 e incrementa o valor da
variável $count para 1. Provavelmente, não é esta a intenção do
programador.
Com "use warnings", a seguinte mensagem vai para "STDERR":
Argument "a" isn't numeric in addition (+)
[O argumento "a" não é numérico na adição (+)]
Note que *warnings* não interrompem o programa, como os erros de
verdade gerados por "strict". A mensagem é enviada para o "arquivo" de
erros, gerando ruído inesperado na saída do programa. O programador,
que deve estar sempre atento a estas mensagens porque indicam erros em
potencial, deve encontrar a sua fonte e tratar de entender e
provavelmente consertar a sua causa.
Há muito mais em "use strict" e "use warnings". Mas a recomendação
básica é use sempre. Hoje apenas código muito exótico do núcleo do
interpretador Perl ousa omitir estas diretivas. (E mesmo em alguns
destes casos, eles foram testados com estas diretivas ligadas e então
desativadas para evitar problemas de compatibilidade com programas
antigos e questões de desempenho.)
Programar em Perl sem "strict" e "warnings" é como andar na corda bamba
sem corda de segurança. É possível mas exige concentração contínua
e os efeitos de um engano podem ser inconvenientes no mínimo.
Triangulo-pm, 2008-06-12 10:00
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.pm.org/pipermail/triangulo-pm/attachments/20090802/cfab407c/attachment.html>
Mais detalhes sobre a lista de discussão Triangulo-pm