• Publicidad

Uso de "eval require"

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

Uso de "eval require"

Notapor situ » 2013-03-09 17:21 @764

Buenas,

Los molesto porque quería consultarles si puedo usar "eval require" para llamar a una función externa.

Tengo un script el cual se está llenando de mucho código y me está haciendo difícil su lectura. Quería saber cómo puedo hacer para llamar a algunas funciones que se encuentren definidas en un archivo externo.

¿Debo definir las variables que se encuentran en la función externa, como globales en mi script?


Saludos
situ
Perlero nuevo
Perlero nuevo
 
Mensajes: 358
Registrado: 2007-04-09 01:44 @114

Publicidad

Re: Uso de "eval require"

Notapor explorer » 2013-03-09 22:12 @966

El usar 'require' o 'use' es para importar variables y funciones de módulos externos a nuestro programa.

Si tienes un código muy largo, es el momento de pensar en dividirlo en módulos, claro.

Para llamar a funciones externas, hay varias formas.

Si solo te interesa saber el resultado de la ejecución de un módulo externo, lo puedes hacer con do():
Sintáxis: (script1.pl) [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2.  
  3. $resultado = do 'script2.pl';
  4.  
  5. print $resultado;
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
Sintáxis: (script2.pl) [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2.  
  3. "Hola\n";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
La ejecución de script1.pl es el $resultado de llamar a script2.pl.

Pero claro, esto es para cosas sencillas.

Si son varias las funciones que hay dentro del segundo archivo, las puedes llamar si usas todo el espacio de nombres:
Sintáxis: (funciones.pm) [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. package funciones;
  3. use strict;
  4.  
  5. # variables privadas
  6. my $var1 = "Hola";
  7. my $var2 = "Adios";
  8.  
  9. # variables globales dentro de este archivo
  10. our $var3 = "Que tal";
  11. our $var4 = "Muy bien";
  12.  
  13. # funciones
  14. sub calcula {
  15.     my $semilla = shift;
  16.    
  17.     $semilla += 1_000;
  18. }
  19.  
  20. 1;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Sintáxis: (script1.pl) [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use strict;
  3. use feature 'say';
  4.  
  5. use funciones;
  6.  
  7. # Acceso a variables dentro de funciones.pm
  8. say $funciones::var4;
  9.  
  10. # Acceso a funciones dentro de funciones.pm
  11. say funciones::calcula(42);
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
En este caso, definimos un módulo, conteniendo variables y una función, y desde el script1.pl accedemos a ellas. Usamos la notación completa para acceder a ellas directamente.

Claro que... escribir 'funciones::' todo el tiempo es un rollo, así que lo que también se hace es importar las variables y funciones que nos interesan al espacio de nombres de nuestro programa, para poder llamarlas como si realmente estuvieran en nuestro programa.

Sintáxis: (funciones.pm) [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. package funciones;
  3. use strict;
  4.  
  5. require Exporter;               # el módulo exportador
  6. our @ISA = 'Exporter';          # nuestro módulo es un heredero del módulo exportador
  7.  
  8. our @EXPORT    = qw($var1 $var2);         # lista de variables y funciones exportadas por defecto, si no importamos nada
  9. our @EXPORT_OK = qw($var3 $var4 calcula); # lista de variables y funciones exportadas de forma opcional
  10.  
  11. our $var1 = "Hola";
  12. our $var2 = "Adios";
  13. our $var3 = "Que tal";
  14. our $var4 = "Muy bien";
  15.  
  16. # funciones
  17. sub calcula {
  18.     my $semilla = shift;
  19.    
  20.     $semilla += 1_000;
  21. }
  22.  
  23. 1;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Sintáxis: (script.pl) [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use strict;
  3. use feature 'say';
  4.  
  5. use funciones;
  6. say $var1;                              # esta variable está exportada por defecto
  7.  
  8. use funciones qw(calcula $var2);        # importamos una función. NOTA: $var1 no sería exportada
  9. say calcula(42);
  10. say $var2;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Como ves, es fácil el dividir un problema grande en varios archivos. Hay más técnicas, como la de la programación orientada a objetos, pero esto es lo básico.

Más información en perldoc perlmod (sección Perl Modules).
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Uso de "eval require"

Notapor situ » 2013-03-10 00:07 @047

Muchas gracias, voy a probarlo.

Quería hacerte otra consulta, resulta que las funciones que son leídas de funciones.pm, necesitan información de las variables de script.pl para realizar su trabajo.

Digamos script.pl mediante un bucle "while" arma una lista de archivo a analizar, y luego esa lista debe ser leída por las funciones del archivo funciones.pm e interpretar la información de estos.

¿Cual de las tres formas que ingresas se adecua a esta necesidad?

Saludos.
situ
Perlero nuevo
Perlero nuevo
 
Mensajes: 358
Registrado: 2007-04-09 01:44 @114

Re: Uso de "eval require"

Notapor explorer » 2013-03-10 06:23 @307

De la misma manera que yo he pasado una constante ('42') a la función, tu puedes pasar argumentos a otras funciones:

my @resultados = funciones::procesa_archivos(@archivos);

o, si se ha importado el nombre de la función:

my @resultados = procesa_archivos(@archivos);
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España


Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: Bing [Bot] y 27 invitados