我正在跟进此事question https://stackoverflow.com/questions/6336270关于 Perl Web 服务。我已经设法从主程序加载和执行模块。每个模块都是这样的:
#!/usr/bin/perl
package NiMbox::perlet::skeleton;
use strict;
use warnings;
require Exporter;
our @ISA = qw(Exporter);
our @EXPORT_OK = qw(%DEFINITION main secondary);
our %DEFINITION;
$DEFINITION{'main'} = {
summary => 'skeleton main',
description => 'long skeleton main description',
args => { 'box' => {}, 'other' => {} }
};
$DEFINITION{'secondary'} = {
summary => 'skeleton secondary',
description => 'long skeleton secondary description'
};
sub main {
print "main...\n";
}
sub secondary {
print "secondary...\n"
}
1;
然后可以像这样调用这些模块:
use NiMbox::perlet::skeleton;
my %DEFINITION = %NiMbox::perlet::skeleton::DEFINITION;
foreach my $s (keys %DEFINITION) {
print "calling sub '$s'\n";
NiMbox::perlet::skeleton->$s();
}
我如何摆脱直接调用NiMbox::perlet:skeleton
以一种方式,我可以做一些看起来像这样的事情(这不起作用,但说明了我需要做的事情):
my $perlet = 'skeleton';
use NiMbox::perlet::$perlet;
my %DEFINITION = %NiMbox::perlet::$perlet::DEFINITION;
foreach my $s (keys %DEFINITION) {
print "calling sub '$s'\n";
NiMbox::perlet::$perlet->$s();
}
因为我非常接近,所以我宁愿看看这个示例中缺少什么,而不是使用另一个库。有任何想法吗?
如果你想让类名动态化,你可以这样做:
my $class = 'NiMbox::perlet::' . $perlet;
my $class_file = $class;
$class_file =~ s{::}{/};
$class_file .= '.pm';
require $class_file;
$class->import;
(或者更好的是,使用模块::加载 http://search.cpan.org/~bingos/Module-Load/lib/Module/Load.pm as @Schwern 建议 https://stackoverflow.com/questions/6525524/how-to-dynamically-load-modules-and-execute-methods-in-perl/6525677#6525677.
得到%DEFINITION
class 有点棘手,因为它涉及符号引用。更好的方法是提供一个返回它的类方法,例如
package NiMbox::perlet::skeleton;
...
sub definition {
my %definition;
$definition{main} = { summary => 'skeleton main', ... };
return %definition;
}
然后你可以做类似的事情:
my %DEFINITION = $class->definition;
foreach my $s( keys %DEFINITION ) {
print "calling sub '$s'\n";
$class->$s;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)