Я слежу за этим question о веб-сервисах perl. Мне удалось загрузить и загрузить модули из основной программы. Каждый из модулей что-то вроде этого:Как динамически загружать модули и выполнять методы в 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 :: скелет».Таким образом, я могу сделать имя модуля переменной и потенциально назвать это как 'docall skeleton main', который будет вызывать' main' sub в пакете 'skeleton'. – rmarimon
Получил это. Просто используйте '$ class -> $ s()'. – rmarimon
@rmarimon Да, это был недосмотр с моей стороны. – Schwern