【问题标题】:How can I load a Perl module at runtime?如何在运行时加载 Perl 模块?
【发布时间】:2011-01-18 13:47:12
【问题描述】:

我想使用 HTML::Template 模块。但是,它没有安装在我用来开发 CGI 脚本的服务器上。

是否可以在运行时加载模块:我在本地 Perl 安装中找到了 Template.pm 文件,并将该文件上传到我正在使用的服务器。

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

【问题讨论】:

  • 我很困惑。如果您已将 Template.pm 上传到您的服务器,您应该能够在编译时使用 'use' 加载它?
  • 我收到一条错误消息:my $template = HTML::Template->new(filename => 'test.tmpl');
  • @coson 还有,错误是什么?
  • 您必须取消注释“使用 HTML::Template”这一行并注释掉“使用模板”
  • Can't locate object method "new" via package "HTML::Template" (也许你忘了加载 "HTML::Template"?) 在 testtemplate.pl 第 20 行。另一件事是我的 Perl Windows 安装中有一个 Template.pm 和四个 HTTP.pm,我不确定应该将哪一个用于 HTML::Template 模块

标签: perl installation module


【解决方案1】:

这是我的工作:

 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

另请参阅perlfaq8 中的How do I keep my own module/library directory?What's the difference between require and use?

【讨论】:

  • 是的,这看起来像你真正想要做的,只需为 perl 知道要查找的模块添加另一个位置,这就是 use lib ... 行正在做的事情(它上面的两行是关于查找相对于脚本的模块位置)
【解决方案2】:

这类似于思南的回答,但使用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")'

【讨论】:

  • +1 当您只想在调试一些 cgi-bin 服务器脚本时使用用户目录中的额外模块时很有用。
【解决方案3】:

HTML::TemplateTemplate 是不同的 Perl 模块。如果你想使用 HTML::Template,你需要在脚本顶部 use HTML::Template; 来导入那个包。

确保您将 HTML/Template.pm 文件从本地计算机复制到服务器,而不是 Template.pm。

【讨论】:

  • 问题是我不知道哪个是正确的 HTML::Template 模块。当我在我的 Windows 安装下搜索时,我看到四个 HTML.pm 和一个 Template.pm。我不确定我应该使用哪一个。我确信我可以一次尝试一个文件。
  • 它将被称为 Template.pm 但将位于名为 HTML 的目录中。这就是 Perl 模块的布局方式,例如Moose::Meta::Class 在 Moose/Meta/Class.pm
  • 是的,我终于根据之前的答案弄清楚了。
【解决方案4】:

我应该将此作为选项添加,因为我是该模块的维护者之一:App::FatPacker 可用于在您的应用程序发布时包含第三方模块,因此不需要在部署环境中单独安装。

【讨论】:

    【解决方案5】:

    是的。看Module::Runtime。即使在本地安装目录中,我也会安装您的 HTML 模块。这可能不那么麻烦。

    【讨论】:

    • 你的意思是把 Template.pm FTP 到服务器上的本地安装目录吗?
    猜你喜欢
    • 2011-02-20
    • 1970-01-01
    • 2013-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多