[Triangulo-pm] [Perl - Básico] #3 Estrito e Cuidadoso
Adriano Ferreira
aferreira em shopzilla.com
Quinta Junho 12 06:07:29 PDT 2008
[Perl - 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
Mais detalhes sobre a lista de discussão Triangulo-pm