Tareas: martes, 8 de febrero de 2022

9 febrero 2022

Resuelto el problema de la depuración en Perl.

Depuración en Perl

Ayer hablé del problema molesto y un tanto estúpido de que al usar el módulo Devel::pktdb para depurar programas algunos parámetros de entrada desaparecían antes de comenzar la ejecución. Esta mañana, más descansado, he recordado que en los toolkits gráficos en UNIX era bastante habitual aceptar parámetros para definir cosas como la geometría, el nombre de la ventana y otros aspectos de la aplicación gráfica. ¿ Podía ser éste el caso ? Puedes apostar tu vida a que sí.

Busqué entonces en la documentación y nada de nada. Todos parecen darlo por sentado por lo que al final he tenido que mirar los fuentes. El módulo Tk.pm que emplea el depurador gráfico Devel::ptkdb carga otros módulos y en ellos se realizan efectivamente la búsqueda y extracción de parámetros para configurar dichos aspectos gráficos.

En el módulo Tk::CmdLine aparece lo siguiente:

sub SetArguments # Tk::CmdLine::SetArguments([@argument])
{
   ...
    my @option = ();
  while ($self->{offset} < @{$self->{argv}})
    {
        last if ($self->{argv}->[$self->{offset}] eq '--');
        unless (
            (($self->{argv}->[$self->{offset}] =~ /^-{1,2}(\w+)$/)  && (@option = $1)) ||
            (($self->{argv}->[$self->{offset}] =~ /^--(\w+)=(.*)$/) && (@option = ($1, $2))))
        {
            ++$self->{offset};
            next;
        }

Comprueba la existencia del literal y no la encuentra almacena opciones en una lista que serán procesadas más adelante por otras funciones y eliminadas de @ARGV.

Así que sí, era un problema que había saltado porque empleaba nombres de parámetros reconocibles por la parte gráfica. Podría haber sido antes con –geometry o algo similar pero no he tenido esa suerte. Como no tengo tiempo de tomar otro camino he terminado por consultar la documentación del módulo Getopt::Long y he visto que se puede establecer un rodeo.

use Getopt::Long qw(GetOptionsFromArray);
...
Getopt::Long::Configure( qw( auto_version auto_help )  );
my @MyARGV = @ARGV; 
shift @MyARGV if $MyARGV[0] eq '--';

GetOptionsFromArray( \@MyARGV,
            'name=s'        =>  \$project,
            'init'          =>  sub { $operation = q(init); }, 
  

Esto es, analizar los parámetros empleando una lista personalizada de la que hemos eliminado el primer parámetro si coincide con . Así puedo seguir depurando sin más tiranteces y como lo he dejado documentado podré corregirlo en el futuro.

Eso me ha hecho replantearme que las herramientas que empleo son bastante antiguas. No me sienta bien reconocer que puedo estar quedándome obsoleto de alguna manera, pero voy a dejarlo aparcado porque tengo suficiente peso a las espaldas para añadir más.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *