2010-02-18 15 views
9

Vorrei utilizzare il modulo HTML :: Template. Tuttavia, non è installato sul server che sto usando per sviluppare script CGI.Come posso caricare un modulo Perl in fase di runtime?

E 'possibile caricare un modulo in fase di esecuzione: ho trovato il file Template.pm sulla mia installazione Perl locale e ho caricato il file sul server che sto 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

Sono confuso. Se hai caricato Template.pm sul tuo server, dovresti riuscire a caricarlo in fase di compilazione con 'use'? – rjh

+0

Ho ricevuto un errore sulla linea: my $ template = HTML :: Template-> new (filename => 'test.tmpl'); – coson

+1

@coson E qual è l'errore? –

risposta

11

Ecco quello che faccio:

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

In script.pl (a meno che non si esegue sotto 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 

Se HTML::Template è veramente opzionale, leggere perldoc -f require.

Vedere anche How do I keep my own module/library directory? e What's the difference between require and use? in perlfaq8.

+1

Sì, sembra proprio quello che si vuole veramente fare, basta aggiungere un altro posto per i moduli che perl sa cercare, che è ciò che sta facendo la riga 'use lib ...' (le due righe sopra sono relative alla ricerca del posizione dei moduli relativa allo script) – Cebjyre

0

Sì, lo è. Guarda Module::Runtime. Vorrei installare il tuo modulo HTML, anche in una directory di installazione locale. Probabilmente è meno problematico.

+0

Intendi FTP Template.pm nella directory di installazione locale sul server? – coson

4

HTML::Template e Template sono diversi moduli Perl. Se si desidera utilizzare HTML :: Template, sarà necessario use HTML::Template; nella parte superiore dello script per importare quel pacchetto.

Assicurarsi di aver copiato il file HTML/Template.pm dal computer locale sul server, anziché Template.pm.

+0

Il problema è che non so quale sia il modulo HTML :: Template corretto. Quando cerco sotto l'installazione di Windows, vedo quattro HTML.pm e un Template.pm. Non sono sicuro di quale dovrei usare. Sono sicuro che potrei provare questo un file alla volta. – coson

+2

Si chiamerà Template.pm ma si troverà in una directory chiamata HTML. Ecco come vengono presentati i moduli Perl, ad es. Moose :: Meta :: Class è in Moose/Meta/Class.pm – rjh

+0

sì, finalmente l'ho capito in base alla risposta precedente. – coson

9

Questo è simile alla risposta di Sinan, ma utilizza local::lib:

Impostare le file come:

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

E nello script:

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

Il vantaggio di città :: lib è possibile installare i moduli da CPAN direttamente in una directory di propria scelta:

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

+1 Utile per quando si desidera utilizzare solo moduli aggiuntivi dalla directory utente durante il debug di alcuni script del server cgi-bin. – GuruM

1

Avrei dovuto aggiungere questo come opzione, dal momento che sono uno dei manutentori di questo modulo: App::FatPacker può essere utilizzato per includere un modulo di terze parti con l'applicazione quando viene spedito, quindi non ha bisogno di essere installato separatamente nell'ambiente di distribuzione.

Problemi correlati