Я хотел использовать ссылку на функцию для динамического выполнения функций из других пакетов.
Я некоторое время пробовал разные решения для этой идеи, и, похоже, ничего не получалось!Итак, я подумал о том, чтобы задать этот вопрос, и, пытаясь это сделать, решение сработало! , но я не уверен, что это правильный способ сделать это: он требует ручной работы и немного "хакерский",Можно ли его улучшить?
Пакет для поддержки необходимой функциональности
package Module;
# $FctHash is intended to be a Look-up table, on-reception
# of command.. execute following functions
$FctHash ={
'FctInitEvaluate' => \&FctInitEvaluate,
'FctInitExecute' => \&FctInitExecute
};
sub FctInitEvaluate()
{
//some code for the evalute function
}
sub FctInitExecute()
{
//some code for the execute function
}
1;
2.Служебный скрипт должен использовать пакет, используя ссылку на функцию
use strict;
use warnings 'all';
no strict 'refs';
require Module;
sub ExecuteCommand()
{
my ($InputCommand,@Arguments) =@_;
my $SupportedCommandRefenece = $Module::FctHash;
#verify if the command is supported before
#execution, check if the key is supported
if(exists($SupportedCommandRefenece->{$InputCommand}) )
{
// execute the function with arguments
$SupportedCommandRefenece->{$InputCommand}(@Arguments);
}
}
# now, evaluate the inputs first and then execute the function
&ExecuteCommand('FctInitEvaluate', 'Some input');
&ExecuteCommand('FctInitExecute', 'Some input');
}
Но теперь эта техника, похоже, работает!Тем не менее, есть ли способ улучшить его?