2010-02-18 28 views
9

Me gustaría utilizar el módulo HTML :: Plantilla. Sin embargo, no está instalado en el servidor que estoy usando para desarrollar scripts CGI.¿Cómo puedo cargar un módulo Perl en tiempo de ejecución?

Es posible cargar un módulo en tiempo de ejecución: Encontré el archivo Template.pm en mi instalación local de Perl y cargué el archivo en el servidor que estoy usando.

#!/usr/bin/perl -w 

use CGI qw(:standard :html4); 
use CGI::Carp qw(warningsToBrowser fatalsToBrowser); 

# use HTML::Template; 

use Template; 

# my $package = "HTML::Template"; 
# eval { 
# (my $pkg = $package) =~ s|::|/|g; # require need a path 
# require "$pkg.pm"; 
# import $package; 
# }; 
# die [email protected] if([email protected]); 

# open the HTML template 
my $template = HTML::Template->new(filename => 'test.tmpl'); 

# fill in some parameters in the template 
$template->param(home => $ENV{HOME}); 
$template->param(path => $ENV{PATH}); 

# send the obligatory Content-Type 
print "Content-Type: text/html\n\n"; 

# print the template 
print $template->output; 
+0

Estoy confundido. Si ha cargado Template.pm en su servidor, ¿debería poder cargarlo en tiempo de compilación con 'use'? – rjh

+0

Recibo un error en la línea: my $ template = HTML :: Template-> new (filename => 'test.tmpl'); – coson

+1

@coson Y, ¿cuál es el error? –

Respuesta

11

Aquí es lo que hago:

  cgi-bin/script.pl 
    cgi-bin/lib/HTML/Template.pm

En script.pl (a menos que esté trabajando con mod_perl):

use FindBin qw($Bin); 
use File::Spec::Functions qw(catfile); 
use lib catfile $Bin, 'lib'; 
use HTML::Template; 

# The rest of your script 

Si HTML::Template es verdaderamente opcional, lea perldoc -f require.

Véase también How do I keep my own module/library directory? y What's the difference between require and use? en perlfaq8.

+1

Sí, esto parece lo que realmente quieres hacer, solo agrega otro lugar para los módulos que Perl sabe que debe buscar, que es lo que está haciendo la línea 'use lib ...' (las dos líneas de arriba se trata de encontrar el la ubicación de los módulos relativa a la secuencia de comandos) – Cebjyre

0

Sí lo es. Mira Module::Runtime. Sin embargo, instalaría su módulo HTML, incluso en un directorio de instalación local. Probablemente sea menos complicado.

+0

¿Quiere decir que transfiere FTP Template.pm al directorio de instalación local en el servidor? – coson

4

HTML::Template y Template son diferentes módulos Perl. Si desea utilizar HTML :: Template, necesitará use HTML::Template; en la parte superior de la secuencia de comandos para importar ese paquete.

Asegúrese de haber copiado el archivo HTML/Template.pm de su máquina local en el servidor, en lugar de Template.pm.

+0

El problema es que no sé cuál es el módulo correcto de HTML :: Plantilla. Cuando busco en mi instalación de Windows, veo cuatro HTML.pm y una Plantilla.pm. No estoy seguro de cuál se supone que debo usar. Estoy seguro de que podría probar esto un archivo a la vez. – coson

+2

Se llamará Template.pm pero estará dentro de un directorio llamado HTML. Así es como se diseñan los módulos Perl, p. Moose :: Meta :: Class está en Moose/Meta/Class.pm – rjh

+0

Sí, finalmente lo descubrí en base a la respuesta anterior. – coson

9

Esto es similar a la respuesta de Sinan, pero utiliza local::lib:

configurar los archivos como:

 
cgi-bin/script.pl 
cgi-bin/lib/HTML/Template.pm 

Y en la secuencia de comandos:

use strict; 
use warnings; 
use local::lib 'lib'; 
use HTML::Parser; 

La ventaja de locales :: lib es que puede instalar módulos de CPAN directamente en un directorio de su elección:

perl -MCPAN -Mlocal::lib=lib -e 'CPAN::install("HTML::Parser")' 
+1

+1 Útil para cuando solo quiera usar módulos extra del directorio de usuarios mientras depura algunos scripts del servidor cgi-bin. – GuruM

1

Debería haber agregado esto como una opción, ya que soy uno de los mantenedores de este módulo: App::FatPacker se puede utilizar para incluir un módulo de terceros con su aplicación cuando se envía, por lo que no necesita ser instalado por separado en el entorno de despliegue.

Cuestiones relacionadas