Perl en Español

  1. Home
  2. Tutoriales
  3. Foro
  4. Artículos
  5. Donativos
  6. Publicidad
 
Índice general » Mundo Perl » Web » require en CGI  RESUELTO Responder al tema
Nuevo tema


Página 1 de 1  [ 6 mensajes ] 
 
Nota 2009-08-25 03:40 @195

Perlero Nuevo
Registrado: 2009-07-29 03:12 @175
Mensajes: 25
require en CGI
Buenas de nuevo. Vuelvo a la carga con otra pregunta por desconocimiento y que a priori debería ser sencilla.

El caso es el siguiente: tengo un pequeño formulario en HTML el cual trato de gestionar mediante un CGI. Hasta ahí sin problemas. El caso es que dentro de este formulario me gustaría incluir funciones escritas en otros scripts. En principio no tiene problemas para cargar los scripts mediante require pero luego cuando le llamo a la función me da error y no me reconoce la ruta del script.

Este sería el código:
Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
  1. BEGIN{
  2.     my $curr_path = $0;
  3.     eval{
  4.         $curr_path=~ s/html\/gestion_formulario\.cgi//;
  5.         require "${curr_path}lib/script.pl";
  6.     } or print "Error loading libraries: \n $@" if ($@);
  7. } # BEGIN
  8.  
  9. # Después llamo a la función
  10. &funcion_script(); # Realiza la actualización de un fichero


El error que me muestra es:
Syntax: [ Download ] [ Hide ]
Using text Syntax Highlighting
undefined subroutine &main::funcion_script called at directorio donde se encuentra el CGI line 10


Última edición por explorer el 2009-08-25 04:04 @211, editado 1 vez en total
Ortografía, bloques de código, términos anglosajones


Nota 2009-08-25 03:55 @205
Avatar de Usuario
Administrador
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España
Mensajes: 10272
Re: require en CGI
El require importa el fichero, pero no importa el espacio de nombres del módulo. Por eso el nombre de la función no es conocida.

Debes hacer un import después del require, con el nombre de las funciones del módulo que quieres usar.

Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
import 'funcion_script';


Quizás te sea mucho más fácil hacer un do():

Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
do "${curr_path}lib/script.pl";


Más información en use().

_________________
JF^D Perl programming


Nota 2009-08-25 05:31 @271

Perlero Nuevo
Registrado: 2009-07-29 03:12 @175
Mensajes: 25
Re: require en CGI
He probado lo que me dices pero resulta que me sigue dando error, pero seguramente por que no lo escribo bien,

Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
  1. require "${curr_path}/lib/MONITOR.pl";
  2. import 'getHTML';
  3.  


y el mensaje que me da es
Citar:
String found where operator expected...
(Do you need to predeclare import?)

He visto el enlace a use pero no me funciona tampoco y además tiene distinta sintaxis, Utiliza
Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
  1.  require MODULO;
  2. Modulo -> import (LIST);

Que tampoco me funciona.


Nota 2009-08-25 05:58 @290
Avatar de Usuario
Administrador
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España
Mensajes: 10272
Re: require en CGI  RESUELTO
Un ejemplo sencillo con do(). Si tenemos este código que almacena la subrutinas
Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
#!/usr/bin/perl

sub getHTML {
    return "<html><body>Hola</body></body>\n";
}

podemos importarlo a nuestro programa con do():
Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
#!/usr/bin/perl
use strict;
use warnings;
use diagnostics;

do 'subrutinas.pl';

print getHTML();

Si lo hiciéramos como un módulo, sería
Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
#!/usr/bin/perl

package subrutinas;

sub getHTML {
    return "<html><body>Hola</body></body>\n";
}

1;
Ahora, el espacio de nombres está dentro de "subrutinas", así que debemos cambiar la forma de hacer la llamada:
Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
#!/usr/bin/perl
use strict;
use warnings;
use diagnostics;

use subrutinas;

print subrutinas::getHTML();

Pero claro, eso es escribir mucho. Nosotros quisiéramos escribir solamente getHTML. Para eso, debemos importar ese nombre de función a nuestro espacio de nombres. El proceso lleva varios pasos (crear una función llamada import() y más cosas), por lo que lo más cómodo es usar el módulo Exporter:
Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
#!/usr/bin/perl

package subrutinas;

require Exporter;
@ISA = qw(Exporter);    # Estos dos líneas equivalen a: use Exporter 'import';

@EXPORT = ('&getHTML');

sub getHTML {
    return "<html><body>Hola</body></body>\n";
}

1;
Y ahora ya podemos llamar a nuestra función directamente:
Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
#!/usr/bin/perl
use strict;
use warnings;
use diagnostics;

use subrutinas;

print getHTML();

En el caso de que no queramos que esta importación suceda en tiempo de compilación, usaremos require:
Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
#!/usr/bin/perl
use strict;
use warnings;
use diagnostics;

require subrutinas;
subrutinas->import('getHTML');

print getHTML();


Más información en perlmod y perlmodlib

_________________
JF^D Perl programming


Nota 2009-08-25 06:07 @296

Perlero Nuevo
Registrado: 2009-07-29 03:12 @175
Mensajes: 25
Re: require en CGI
Vale gracias, me convence más la última porque es la opción que más seria me parece, así que si tengo algún problema ya volveré, jejeje


Nota 2009-08-25 07:27 @352
Avatar de Usuario
Administrador
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España
Mensajes: 10272
Re: require en CGI
Jeje... sí, parece seria, pero al final, un require hace un do():
Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
sub require {
    my ($filename) = @_;
    if (exists $INC{$filename}) {
        return 1 if $INC{$filename};
        die "Compilation failed in require";
    }
    my ($realfilename,$result);
    ITER: {
        foreach $prefix (@INC) {
            $realfilename = "$prefix/$filename";
            if (-f $realfilename) {
                $INC{$filename} = $realfilename;
                $result = do $realfilename;      # <=== carga del fichero
                last ITER;
            }
        }
        die "Can't find $filename in \@INC";
    }
    if ($@) {
        $INC{$filename} = undef;
        die $@;
    } elsif (!$result) {
        delete $INC{$filename};
        die "$filename did not return true value";
    } else {
        return $result;
    }
}

(extraído de la documentación de require.

_________________
JF^D Perl programming


Responder al tema  [ 6 mensajes ] 

Reglas del Foro
No puedes abrir nuevos temas en este Foro
No puedes responder a temas en este Foro
No puedes editar tus mensajes en este Foro
No puedes borrar tus mensajes en este Foro
No puedes enviar adjuntos en este Foro

Publicidad

Socializa

Síguenos por Twitter

Suscríbete GRATUITAMENTE al Boletín de Perl en Español

Saltar a:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Traducción al español por Huan Manwë para phpbb-es.com
phpBB SEO