是否可以在运行时在Perl中加载模块?我尝试了以下,但它没有用。我在程序中的某处写了以下内容:
require some_module;
import some_module ("some_func");
some_func;
答案 0 :(得分:10)
package Foo;
use strict;
use warnings;
use base qw(Exporter);
our @EXPORT = qw(bar);
sub bar { print "bar(@_)\n" }
1;
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)
给出软件包的名称,将其用作use
或require
的裸字:
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;
您可能不想自己做这项工作,因为它很容易弄乱,使用另一个模块可能不是问题。但是,有时增加另一个第三方依赖项的重要性并不值得。那是一个不同的问题,其答案取决于当地情况。