我正在跟進關於perl web服務的此question。我設法從一個主程序加載和執行模塊。每個模塊是這樣的:如何動態加載模塊並在perl中執行方法
#!/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();
}
由於我非常接近我寧願看到缺什麼在這個例子中,而不是使用另一個庫。有任何想法嗎?
感謝這麼好的解釋。我唯一需要擺脫的是最後一個'NiMbox :: perlet :: skeleton'。通過這種方式,我可以使模塊的名稱成爲一個變量,並且可能會調用它,像'docall skeleton main',它將調用'skeleton'包中的'main'子項。 – rmarimon
明白了。只需使用'$ class - > $ s()'。 – rmarimon
@rmarimon是的,這是我的一個疏忽。 – Schwern