gpt4 book ai didi

perl - 动态加载 Perl 模块

转载 作者:行者123 更新时间:2023-12-01 04:29:52 24 4
gpt4 key购买 nike

我正在尝试制作一个可扩展的系统,借此我可以编写一个新模块作为处理程序。我希望程序自动加载任何放入 Handlers 目录并符合 Moose::Role 接口(interface)的新 .pm 文件。

我想知道是否有 Perl 模块或更 Moose 认可的方式来自动执行此操作?这是我到目前为止所构建的,但它似乎有点冗长,并且必须有一种更简单的方法来做到这一点。
handler.pl包含:

    #!/usr/bin/perl
use Handler;
use Data::Dumper;

my $base_handler = Handler->new();
$base_handler->load_modules('SysG/Handler');
print Dumper($base_handler);
Handler.pm包含:
    package Handler;
use Moose;

has 'handlers' => ( traits => ['Array'], handles => { add_handler => 'push' } );

sub load_modules {
my ($self,$dir) = @_;

push(@INC, $dir);

my @modules = find_modules_to_load($dir);
eval {
# Note that this sort is important. The processing order will be critically important.
# The sort implies the sort order
foreach my $module ( sort @modules) {
(my $file = $module) =~ s|::|/|g;
print "About to load $file.pm for module $module\n" ;
require $file . '.pm';
$module->import();
my $obj = $module->new();
$self->add_handler($obj);
1;
}
} or do {
my $error = $@;
print "Error loading modules: $error" if $error;
};

}

sub find_modules_to_load {
my ($dir) = @_;
my @files = glob("$dir/*.pm");
my $namespace = $dir;
$namespace =~ s/\//::/g;

# Get the leaf name and add the System::Module namespace to it
my @modules = map { s/.*\/(.*).pm//g; "${namespace}::$1"; } @files;
die "ERROR: No classifier modules found in $dir\n" unless @modules;
return @modules;
}

1;

然后我创建了一个名为 SysG/Handler 的目录,并添加了两个通常符合 Moose::Role 的 .pm 文件(好像定义了一个也必须遵守的接口(interface))。
SysG::Handler::0001_HandleX.pm stub 包含:
package SysG::Handler::0001_HandleX;
use Moose;
1;
SysG::Handler::0002_HandleX.pm stub 包含:
package SysG::Handler::0002_HandleY;
use Moose;
1;

将所有这些放在一起,Data::Dumper 结果是:
$VAR1 = bless( {
'handlers' => [
bless( {}, 'SysG::Handler::0001_HandleX' ),
bless( {}, 'SysG::Handler::0002_HandleY' )
]
}, 'Handler' );

所以,现在我重复我最初的问题:必须有一种更简单的方式,或者一个模块或 Moose 方式来自动加载特定目录中的任何模块。

任何驼鹿专家可以在这里提供帮助吗?

最佳答案

关于perl - 动态加载 Perl 模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8301959/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com