假设我有一个perl模块文件,我想在运行时动态包含和使用它。所述模块包括一个我需要实例化的类,直到运行时才知道它的名称。
例如,
#inside module.pm
package module;
sub new {
#setup object
}
#inside main.pl
#get module.pm as argument
my $module_var = #load reference to module using text argument?
my $module_instance = $module_var->new();
答案 0 :(得分:9)
这可以在没有eval的情况下完成,如下所示:
my $module_name = 'Some::Module';
(my $require_name = $module_name . ".pm") =~ s{::}{/}g;
require $require_name;
my $obj = $module_name->new();
如果您需要多次执行此操作,只需将该代码包装在子例程中:
sub load_module {
for (@_) {
(my $file = "$_.pm") =~ s{::}{/}g;
require $file;
}
}
load_module 'Some::Module', 'Another::Module';
答案 1 :(得分:5)
my $module_var = 'module';
eval "use $module_var; 1" or die $@;
my $module_instance = $module_var->new();
请注意,eval
是一个可能的安全漏洞。如果$module_var
包含代码,则会执行该代码。解决此问题的一种方法是使用Class::MOP。将eval
行替换为:
use Class::MOP;
Class::MOP::load_class($module_var);
如果您不想要Class :: MOP,可以将_is_valid_class_name
函数从它复制到您的代码中,并确保$module_var
包含有效的类eval
{{1}} 1}}它。 (请注意,如果您使用的是Moose,那么您已经在幕后使用了Class :: MOP。)
答案 2 :(得分:0)
您可以使用eval
执行此操作。
my $module = "Foo";
eval "use $module;1" or die($@); # Couldn't load module