Как я могу загрузить модуль Perl во время выполнения?

Я хотел бы использовать модуль HTML::Template. Однако он не установлен на сервере, который я использую для разработки сценариев CGI.

Можно ли загрузить модуль во время выполнения: я нашел файл Template.pm в моей локальной установке Perl и загрузил файл на сервер, который я использую.

#!/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 $@ if( $@ );

# 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;

person coson    schedule 18.02.2010    source источник
comment
Я смущен. Если вы загрузили Template.pm на свой сервер, вы сможете загрузить его во время компиляции с помощью 'use'?   -  person rjh    schedule 19.02.2010
comment
Я получаю сообщение об ошибке: my $template = HTML::Template-›new(filename =› 'test.tmpl');   -  person coson    schedule 19.02.2010
comment
@coson А в чем ошибка?   -  person Sinan Ünür    schedule 19.02.2010
comment
Вы должны раскомментировать строку use HTML::Template и закомментировать use Template   -  person ccheneson    schedule 19.02.2010
comment
Не удается найти новый метод объекта через пакет HTML::Template (возможно, вы забыли загрузить HTML::Template?) в строке 20 testtemplate.pl. Другое дело, что у меня есть Template.pm и четыре HTTP.pm в моем Perl. Установка Windows, и я не уверен, какой из них я должен использовать для модуля HTML::Template   -  person coson    schedule 19.02.2010
comment
Является ли Template.pm, который вы нашли, частью HTML::Template или какой-либо другой системы шаблонов?   -  person ysth    schedule 19.02.2010


Ответы (5)


Вот что я делаю:

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

В script.pl (если вы не работаете под 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

Если HTML::Template действительно необязателен, прочтите perldoc -f require.

См. также Как сохранить собственный каталог модулей/библиотек? и В чем разница между require и use? в perlfaq8.

person Sinan Ünür    schedule 18.02.2010
comment
Да, это похоже на то, что вы на самом деле хотите сделать, просто добавьте еще одно место для модулей, которые perl знает, что нужно искать, что и делает строка use lib ... (две строки над ней о поиске местоположения модулей относительно скрипта) - person Cebjyre; 19.02.2010

Это похоже на ответ Синана, но использует local::lib:

Настройте свои файлы как:

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

И в вашем сценарии:

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

Преимущество local::lib в том, что вы можете устанавливать модули из CPAN прямо в каталог по вашему выбору:

perl -MCPAN -Mlocal::lib=lib -e 'CPAN::install("HTML::Parser")'
person Ether    schedule 19.02.2010
comment
+1 Полезно, когда вы просто хотите использовать дополнительные модули из пользовательского каталога при отладке некоторых скриптов сервера cgi-bin. - person GuruM; 05.10.2012

HTML::Template и Шаблон — это разные модули Perl. Если вы хотите использовать HTML::Template, вам потребуется use HTML::Template; в верхней части скрипта, чтобы импортировать этот пакет.

Убедитесь, что вы скопировали файл HTML/Template.pm с локального компьютера на сервер, а не файл Template.pm.

person rjh    schedule 18.02.2010
comment
Проблема в том, что я не знаю, какой модуль HTML::Template правильный. Когда я ищу в своей установке Windows, я вижу четыре HTML.pm и Template.pm. Я не уверен, какой из них я должен использовать. Я уверен, что смогу попробовать это по одному файлу за раз. - person coson; 19.02.2010
comment
Он будет называться Template.pm, но будет находиться внутри каталога с именем HTML. Так располагаются модули Perl, например. Moose::Meta::Class находится в Moose/Meta/Class.pm - person rjh; 19.02.2010
comment
да, я наконец понял это на основе предыдущего ответа. - person coson; 19.02.2010

Я должен был добавить это как вариант, так как я являюсь одним из сопровождающих этого модуля: Приложение: :FatPacker можно использовать для включения стороннего модуля в ваше приложение при его поставке, поэтому его не нужно устанавливать отдельно в среде развертывания.

person Ether    schedule 15.10.2012

Да, это. Посмотрите Module::Runtime. Я бы установил ваш HTML-модуль, даже в локальный каталог установки. Наверное, меньше хлопот.

person volvox    schedule 18.02.2010
comment
Вы имеете в виду FTP Template.pm в локальный каталог установки на сервере? - person coson; 19.02.2010