Я полагаю, что вы ищете Экспортер или его многочисленные последующие модули.Я вижу, что вы уже используете его в своем модуле, но вы не используете его для получения %DEFINITION
.Вы сделали бы это так:
use NiMbox::perlet::skeleton qw(%DEFINITION);
foreach my $s (keys %DEFINITION) {
print "calling sub '$s'\n";
NiMbox::perlet::skeleton->$s();
}
Это псевдоним %NiMbox::perlet::skeleton::DEFINITION
к %DEFINITION
и экономит кучу ввода.
Чтобы иметь возможность использовать определение переменной %DEFINITION
Вы можете использовать «символические ссылки» для ссылки на переменную по имени ... но это чревато опасностью.Кроме того, экспорт глобальных переменных означает, что вы можете иметь только одну переменную в заданном пространстве имен.Мы можем сделать лучше.
Вместо этого я бы предложил заменить хэш %DEFINITION
на метод класса definition()
, который возвращает ссылку на% DEFINITION.Вы можете вернуть хеш, но ссылка не позволяет тратить время на копирование.
package NiMbox::perlet::skeleton;
use strict;
use warnings;
my %DEFINITION = ...;
sub definition {
return \%DEFINITION;
}
Теперь вы можете вызвать этот метод и получить хэш ref.
use NiMbox::perlet::skeleton;
my $definition = NiMbox::perlet::skeleton->definition;
foreach my $s (keys %$definition) {
print "calling sub '$s'\n";
NiMbox::perlet::skeleton->$s();
}
Делать это динамически, единственноеХитрость заключается в том, чтобы загрузить класс.Вы можете eval "require $class" or die $@
, но это имеет значение для безопасности. UNIVERSAL :: требуется или Module :: Load может справиться с этим лучше для вас.
use Module::Load;
my $class = 'NiMbox::perlet::skeleton';
load $class;
my $definition = $class->definition;
foreach my $s (keys %$definition) {
print "calling sub '$s'\n";
$class->$s();
}