如何在Perl中运行时加载模块?

时间:2010-05-18 07:24:32

标签: perl module

是否可以在运行时在Perl中加载模块?我尝试了以下,但它没有用。我在程序中的某处写了以下内容:

require some_module;
import some_module ("some_func");
some_func;

4 个答案:

答案 0 :(得分:10)

Foo.pm

package Foo;

use strict;
use warnings;

use base qw(Exporter);
our @EXPORT = qw(bar);

sub bar { print "bar(@_)\n" }

1;

script.pl

use strict;
use warnings;

require Foo;
Foo->import('bar');
bar(1, 22, 333);

答案 1 :(得分:5)

最简单的方法可能是使用像Module::Load这样的模块:

use Module::Load;
load Data::Dumper;

答案 2 :(得分:2)

看看这个“How to dynamically load modules”,您还可以在Perl编程中查​​看[DynaLoader - Perl模块的自动动态加载]。

答案 3 :(得分:0)

给出软件包的名称,将其用作userequire的裸字:

use Some::Module;
require Some::Module;

要导入符号,您可以为use提供其他参数(不带参数,它将导入软件包定义的所有默认符号):

use Some::Module qw(func1 func2 ...)

使用require,您必须自己调用import:

require Some::Module;
Some::Module->import( qw(func1 func2 ...) );

您会在use文档中看到它是require的一种奇特形式,发生在编译时:

BEGIN { require Module; Module->import( LIST ); }

现在,这就是大多数时间加载大多数模块的方式。当人们提前不知道包装名称时,还会有另一个答案。

鉴于某些软件包名称是字符串,因此您可以执行多种操作。其他答案中提到的各种模块只是为您完成此任务。

require可以在eval中做到这一点:

eval "require $class" or die ...;

人们对eval感到不安,因为在$class中很容易出现任何内容,而且他们可能运行意外的代码。但这就是便捷模块经常为您完成的工作,其中包含一些健全性检查。

除此之外,您还可以将类名转换为文件名。 Perl 5很简单,因为::成为目录分隔符,并且在最后添加了.pm。然后,您可以将该文件名提供给require,它将在@INC中查找它:

# sanity check, moderately restrictive
die "Bad name!" unless m/\A [A-Za-z0-9_]+ (::[A-Za-z0-9_])* \z/x;
my $filename = "$class.pm";
$filename =~ s/::/\//g;
require $filename;

您可能不想自己做这项工作,因为它很容易弄乱,使用另一个模块可能不是问题。但是,有时增加另一个第三方依赖项的重要性并不值得。那是一个不同的问题,其答案取决于当地情况。