La solución más habitual es... poner prints:
Using perl Syntax Highlighting
print "DEBUG: Empezando el bucle...\n";
foreach my $tarea ( @pendientes ) {
print "DEBUG: Haciendo la tarea $tarea\n";
# procesando la $tarea
}
print "DEBUG: Fin del bucle\n";
foreach my $tarea ( @pendientes ) {
print "DEBUG: Haciendo la tarea $tarea\n";
# procesando la $tarea
}
print "DEBUG: Fin del bucle\n";
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
Cuando terminemos el programa y comprobemos que funciona, nos tocará quitar o comentar los prints...
Claro que... ¿y si descubrimos más tarde que el programa sigue fallando? Tenemos que volver a poner los prints... o descomentar las líneas. Mucho trabajo...
¿Qué podemos hacer?
Una forma sencilla de resolverlo, sin tener que ensuciar mucho nuestro código, es agregar una condición a nuestros prints.
Using perl Syntax Highlighting
my $debug = 1;
print "DEBUG: Empezando el bucle...\n" if $debug;
foreach my $tarea ( @pendientes ) {
print "DEBUG: Haciendo la tarea $tarea\n" if $debug;
# procesando la $tarea
}
print "DEBUG: Fin del bucle\n" if $debug;
print "DEBUG: Empezando el bucle...\n" if $debug;
foreach my $tarea ( @pendientes ) {
print "DEBUG: Haciendo la tarea $tarea\n" if $debug;
# procesando la $tarea
}
print "DEBUG: Fin del bucle\n" if $debug;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
De esta manera, según pongamos un '1' o '0' en la línea donde definimos la variable $debug, se ejecutarán las líneas con los prints, o no.
Una forma más bonita de hacerle es usando constantes. Porque, naturalmente, el valor de la variable $debug no queremos que cambie a lo largo de todo el programa (hay excepciones, como en los casos en los que queremos tracear una parte de un programa y otra no).
Nuestro código quedaría así:
Using perl Syntax Highlighting
use constant DEBUG => 1;
print "DEBUG: Empezando el bucle...\n" if DEBUG;
foreach my $tarea ( @pendientes ) {
print "DEBUG: Haciendo la tarea $tarea\n" if DEBUG;
# procesando la $tarea
}
print "DEBUG: Fin del bucle\n" if DEBUG;
print "DEBUG: Empezando el bucle...\n" if DEBUG;
foreach my $tarea ( @pendientes ) {
print "DEBUG: Haciendo la tarea $tarea\n" if DEBUG;
# procesando la $tarea
}
print "DEBUG: Fin del bucle\n" if DEBUG;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Si usamos de forma normal algún módulo como Sysadm::Install, podemos incluso dejarlo un poco más sencillo:
Using perl Syntax Highlighting
use Sysadm::Install qw(say);
use constant DEBUG => 1;
say "DEBUG: Empezando el bucle..." if DEBUG;
foreach my $tarea ( @pendientes ) {
say "DEBUG: Haciendo la tarea $tarea" if DEBUG;
# procesando la $tarea
}
say "DEBUG: Fin del bucle" if DEBUG;
use constant DEBUG => 1;
say "DEBUG: Empezando el bucle..." if DEBUG;
foreach my $tarea ( @pendientes ) {
say "DEBUG: Haciendo la tarea $tarea" if DEBUG;
# procesando la $tarea
}
say "DEBUG: Fin del bucle" if DEBUG;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Más profesional es usar un módulo como Log::Log4Perl
Using perl Syntax Highlighting
use Log::Log4perl qw(:easy);
Log::Log4perl->easy_init( $DEBUG );
DEBUG "Empezando el bucle...";
foreach my $tarea ( @pendientes ) {
DEBUG " Haciendo la tarea $tarea";
# procesando la $tarea
}
DEBUG "Fin del bucle";
Log::Log4perl->easy_init( $DEBUG );
DEBUG "Empezando el bucle...";
foreach my $tarea ( @pendientes ) {
DEBUG " Haciendo la tarea $tarea";
# procesando la $tarea
}
DEBUG "Fin del bucle";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Por ejemplo, una vez que comprobemos que el programa va funcionando bien, podemos ir reduciendo el nivel de detalle de los mensajes, con sólo cambiar $DEBUG por $INFO, $WARN, $ERROR o $FATAL. En el ejemplo anterior, si cambiamos $DEBUG por $ERROR, ya no veremos salir los mensajes.
Y también podemos sacar los mensajes a pantalla o a fichero o a los dos a la vez. Y configurar el depurado con ficheros de configuración externos (podemos, en una línea, decidir que todos nuestros programas en producción generen salida de depurado o no). Podemos definir plantillas para decir cómo será el formato de los ficheros que escribirá, o morir de forma elegante: