繁体   English   中英

Perl,动态包含包

[英]Perl, dynamically include package

假设我有一个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();

这可以在没有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';
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它。 (请注意,如果您使用的是Moose ,那么您已经在幕后使用了Class :: MOP。)

您可以使用eval执行此操作。

my $module = "Foo";
eval "use $module;1" or die($@); # Couldn't load module

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM