• Publicidad

Cómo lanzar una subrutina cuyo nombre está en una variable

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Cómo lanzar una subrutina cuyo nombre está en una variable

Notapor fgalves » 2007-05-24 03:45 @198

Hola a todos,

Mi duda es muy simple:

Tengo una variable que contiene el nombre de un "sub", cuyo contenido es obtenido de forma dinámica:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$decodingPluginCommand
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


Lo que quiero es llamar o invocar a dicho sub.
Lo he probado de las siguientes dos formas:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$decodingPluginCommand($segment);
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

y
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
&$decodingPluginCommand($segment);
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


pero ninguna de ellas funciona.

¿Alguien me puede echar un cablecito?
¡Muchas gracias y saludos!
Felipe
fgalves
Perlero nuevo
Perlero nuevo
 
Mensajes: 210
Registrado: 2006-09-25 13:54 @621

Publicidad

Notapor explorer » 2007-05-24 03:56 @205

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$decodingPluginCommand->();
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor fgalves » 2007-05-24 04:05 @212

Desgraciadamente continuo teniendo problemas.

Para el siguiente codigo:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my %result = $decodingPluginCommand->($segment);
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


obtengo el siguiente mensaje de error:

Código: Seleccionar todo
Can't use string ("decode_MDW_1_2") as a subroutine ref while "strict refs" in use at printDecodedLine.pl line 173, <STATFILE> line 2.


donde

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$decodingPluginCommand = "decode_MDW_1_2"
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4



Alguna idea de lo que estoy haciendo mal ahora?
Muchas gracias!
Saludos!
Felipe
fgalves
Perlero nuevo
Perlero nuevo
 
Mensajes: 210
Registrado: 2006-09-25 13:54 @621

Notapor fgalves » 2007-05-24 04:07 @213

Ok, acabo de comentar el "use strict"...
Creo que viene de ahi...
fgalves
Perlero nuevo
Perlero nuevo
 
Mensajes: 210
Registrado: 2006-09-25 13:54 @621

Notapor fgalves » 2007-05-24 04:18 @221

Vaya, parece que me voy acercando pero sigo sin dar en el clavo...

Como dije antes, he comentado la entrada "use strict", y ahora obtengo el error siguente:

Código: Seleccionar todo
Undefined subroutine &main::decode_MDW_1_2 called at printDecodedLine.pl line 173, <STATFILE> line 2.


Dicha subrutina (decode_MDW_1_2) no esta definida en este script perl sino en un perl module el cual declaro al inicio del programa:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
use MDW_1_2; #package MDW_1_2 definido en un perl module externo MDW_1_2.pm
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Por lo tanto, no consigo ver pq no consigue encontrar dicha funcion, si estoy haciendo un "use" del package en cuestion...
Alguna sugerencia?

Gracias por adelantado!
Felipe
fgalves
Perlero nuevo
Perlero nuevo
 
Mensajes: 210
Registrado: 2006-09-25 13:54 @621

Notapor explorer » 2007-05-24 04:31 @230

Pero es que aunque lo 'uses', debes 'importar' ese nombre al espacio de nombres de tu programa.

Tu programa está intentando buscar main::decode_MDW_1_2 (el nombre de la sub en el espacio de nombres de main), porque no sabe que en realidad debería ser MDW_1_2::decode_MDW_1_2.

Entonces tienes dos opciones... o agregas "MDW_1_2::" a la variable (y ahora tengo la duda de que funcione, pero creo que sí), y la otra es importar el nombre de esa sub en tu programa, con los mecanismos clásicos de importación de nombres (Exporter.pm).
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor fgalves » 2007-05-24 04:41 @236

Ya habia probado lo de añadir el nombre del package delante, para indicar donde buscar la funcion:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my %result = $decodingPlugin::$decodingPluginCommand->($segment);
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


donde:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$decodingPlugin = "MDW_1_2"
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
y
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$decodingPluginCommand = "decode_MDW_1_2"
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


El error que obtengo es el siguiente:

Código: Seleccionar todo
Scalar found where operator expected at printDecodedLine.pl line 176, near "$decodingPlugin::$decodingPluginCommand"
        (Missing operator before $decodingPluginCommand?)
syntax error at printDecodedLine.pl line 176, near "$decodingPlugin::$decodingPluginCommand"
Execution of printDecodedLine.pl aborted due to compilation errors.


Luego probe lo siguiente solo por curiosidad (el nombre del DecodingPlugin tambien es obtenido dinamicamente) :

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my %result = MDW_1_2::$decodingPluginCommand->($segment);
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


y el error obtenido fue el siguiente:

Código: Seleccionar todo
Bad name after MDW_1_2:: at printDecodedLine.pl line 176.


Voy a echar una ojeada a eso del Exporter.pm....
Saludos!!
Felipe
fgalves
Perlero nuevo
Perlero nuevo
 
Mensajes: 210
Registrado: 2006-09-25 13:54 @621

Notapor explorer » 2007-05-24 05:22 @265

Pon el "use warnings;" al principio del programa.

Ya encontré el fallo:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my %result = "${decodingPlugin}::$decodingPluginCommand"->($segment);
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Es que para Perl, los '::' son especiales...
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor fgalves » 2007-05-24 06:09 @298

Hola de nuevo Explorer,

El "use warnings" ya lo tenia puesto, de hecho, intento agarrar buenos habitos al programar en perl (usando siempre los modulos strict y warnings).

Te agradezco muchisimo haber dado con la solucion, pues no estaba facil la cosa!!

Un saludo cordial!!
Felipe
fgalves
Perlero nuevo
Perlero nuevo
 
Mensajes: 210
Registrado: 2006-09-25 13:54 @621


Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado

cron