2010-02-18 9 views
9

Ich möchte das HTML :: Template-Modul verwenden. Es ist jedoch nicht auf dem Server installiert, auf dem ich CGI-Skripte entwickle.Wie kann ich ein Perl-Modul zur Laufzeit laden?

Ist es möglich, ein Modul zur Laufzeit zu laden: Ich fand die Datei Template.pm auf meiner lokalen Perl-Installation und lud die Datei auf den Server, den ich verwende.

#!/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

Ich bin verwirrt. Wenn Sie Template.pm auf Ihren Server hochgeladen haben, sollten Sie in der Lage sein, es zur Kompilierzeit mit 'Use' zu laden? – rjh

+0

Ich erhalte einen Fehler in der Zeile: mein $ template = HTML :: Vorlage-> neu (Dateiname => 'test.tmpl'); – coson

+1

@coson Und was ist der Fehler? –

Antwort

11

ist, was ich tue:

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

In script.pl (es sei denn, Sie unter mod_perl ausgeführt werden):

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

# The rest of your script 

Wenn HTML::Template wirklich optional, lesen perldoc -f require.

Siehe auch How do I keep my own module/library directory? und What's the difference between require and use? in perlfaq8.

+1

Ja, das sieht aus wie das, was du eigentlich machen willst, füge einfach einen anderen Platz für Module hinzu, nach denen Perl suchen kann, was die 'usage lib ...' Zeile macht (die zwei Zeilen darüber suchen nach dem Position der Module relativ zum Skript) – Cebjyre

0

Ja ist es. Schauen Sie sich Module::Runtime an. Ich würde Ihr HTML-Modul aber auch in einem lokalen Installationsverzeichnis installieren. Es ist wahrscheinlich weniger Ärger. Hier

+0

Meinst du FTP die Template.pm im lokalen Installationsverzeichnis auf dem Server? – coson

4

HTML::Template und Template sind verschiedene Perl-Module. Wenn Sie HTML :: Template verwenden möchten, müssen Sie use HTML::Template; oben im Skript eingeben, um dieses Paket zu importieren.

Stellen Sie sicher, dass Sie die HTML/Template.pm-Datei von Ihrem lokalen Computer auf den Server kopiert haben, anstatt Template.pm.

+0

Das Problem ist, ich weiß nicht, welches das korrekte HTML :: Template-Modul ist. Wenn ich unter meiner Windows-Installation suche, sehe ich vier HTML.pm und eine Template.pm. Ich bin mir nicht sicher, welchen ich verwenden soll. Ich bin mir sicher, dass ich das in einer Datei nach dem anderen ausprobieren könnte. – coson

+2

Es wird Template.pm genannt, befindet sich aber in einem Verzeichnis namens HTML. So werden Perl-Module ausgelegt, z. Moose :: Meta :: Class ist in Moose/Meta/Class.pm – rjh

+0

Ja, das habe ich schließlich anhand der vorherigen Antwort herausgefunden. – coson

9

Dies ist zu Sinans Antwort ähnlich, verwendet aber local::lib:

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

Und in Ihrem Skript:

Ihre Dateien einrichten

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

Der Vorteil der lokalen :: lib ist, dass Sie Module von CPAN direkt in ein Verzeichnis Ihrer Wahl installieren können:

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

+1 Nützlich, wenn Sie beim Debuggen einiger cgi-bin Server-Skripts nur zusätzliche Module aus dem Benutzerverzeichnis verwenden möchten. – GuruM

1

Ich sollte dies als eine Option hinzugefügt haben, da ich einer der Betreuer dieses Moduls bin: App::FatPacker kann verwendet werden, um ein Drittanbieter-Modul mit Ihrer Anwendung zu enthalten, wenn es versendet, so muss es nicht sein separat in der Implementierungsumgebung installiert.

Verwandte Themen