我正在编写一个带插件模块的IRC bot。有一个SQLite DB存储命令定义。
我将拥有一个模块Bot::Plugins::Modes
,它将包含kick
和voice
等方法。我像这样实例化Modes
:
$modes = new Bot::Plugins::Modes
我可以调用这样的方法:
$modes->voice(arg1 arg2);
在我的数据库中,我有字段module
和method
。对于此示例,模块和方法分别为modes
和voice
。
侦听bot命令的侦听器执行它们。我想做点像......
&{"$module->$method"}(arg1, arg2)
但我无法弄清楚语法。在它们可以通过模块加载之前,我只能做:
&{$command}(arg1, arg2)
其中$command
是数据库中的方法字段。在这种情况下,它只是“声音”,而voice
是一个子程序。
答案 0 :(得分:4)
类和方法名称都可以是标量。其余的语法是正常的。
my $module = "Foo";
my $method = "bar";
# Same as Foo->bar($arg1, $arg2);
$module->$method($arg1, $arg2);
答案 1 :(得分:3)
$module->$method(arg1, arg2);
另外,UNIVERSAL::can
如果要在调用方法之前检查方法是否存在。
$sub = $module->can($method);
if ($sub) {
&$sub($module, arg1, arg2);
}
(调用&$sub(arg1, arg2)
就像调用package::method(arg1, arg2)
,而不是package->method(arg1, arg2)
。)