*
use strict; Nos comprometemos a que a partir de esta línea vamos a programar de forma "estricta" (generar un error en tiempo de compilación si usamos referencias simbólicas, generar un error en tiempo de compilación si estamos usando variables que no han sido declaradas antes, y generar un error en tiempo de compilación si estamos usando una palabra suelta como si fuera una llamada a una función)
*
use warnings; muestra avisos de cualquier cosa sospechosa de ser un error de programación (entre otras cosas).
El primero te obligará a programar de forma "correcta". En lugar de hacer programas así:
Using perl Syntax Highlighting
#!/usr/bin/perl
$dimension = 'radio'; # variables no declaradas en ningún sitio
$pi = 3.1416;
$$dimension = 12; # referencia simbólica $radio
$unidad = centimetros; # palabra suelta
$circunferencia = 2 * $radio * $pi;
print "La circunferencia tiene $circunferencia $unidad\n";
__END__
La circunferencia tiene 75.3984 centimetros
Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
nos obliga a escribirlos así:
Using perl Syntax Highlighting
#!/usr/bin/perl
use strict;
use warnings;
my $radio = 12;
my $pi = 3.1416;
my $unidad = 'centimetros';
my $circunferencia = 2 * $radio * $pi;
print "La circunferencia tiene $circunferencia $unidad\n";
__END__
Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
Como ves, nos vemos obligados a declarar todas nuestras variables con my(), para indicar que todas ellas van a ser locales a nuestro programa (no van a ser conocidas fuera de él). Y nada de referencias simbólicas o usar palabras sueltas.
Seguro que el fallo que te sale es porque estás usando variables sin declararlas con my().
Esto, tiene una enorme ventaja cuando estás empezando a programar en Perl, porque perl te va a avisar de cada variable nueva que él encuentre y no hayas declarado: de esa manera localizarás inmediatamente errores de programación por fallos en la escritura. Ejemplo:
Using perl Syntax Highlighting
#!/usr/bin/perl
use strict;
use warnings;
my $radio = 12;
my $pi = 3.1416;
my $unidad = 'centimetros';
my $circunferencia = 2 * $radio * $pi;
print "La circunferencia tiene $circunfrencia $unidad\n";
__END__
Global symbol "$circunfrencia" requires explicit package name at ./kk.pl line 11.
Execution of ./kk.pl aborted due to compilation errors.
Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
Si no tuvieras el 'strict' puesto, perl no daría ningún error (Perl es un lenguaje muy liberal y, si no le advertimos, admitirá muchos engendros que escribamos), pero no saldría lo que querríamos.
Si en vez de 'strict' estuviera puesto solo 'warnings', perl nos informará de esta manera:
Using text Syntax Highlighting
Name "main::circunfrencia" used only once: possible typo at ./kk.pl line 11.
Use of uninitialized value in concatenation (.) or string at ./kk.pl line 11.
La circunferencia tiene centimetros
Coloreado en 0.000 segundos, usando
GeSHi 1.0.8.4
que es decir: "he encontrado algo raro, pero aún así, lo he ejecutado".
El uso de los dos es una buena manera de aprender a programar Perl, y además, saber que tenemos la tranquilidad de que el propio perl nos informará de los errores de programación (al menos, los referidos a fallos de escritura).
Yo, particularmente, desde que uso Perl v5.10, uso el módulo
common::sense, que activa estos y otros controles, para conseguir y obligarte a escribir programas Perl muy legibles.