2

我正在编写一个带有插件模块的 IRC 机器人。有一个存储命令定义的 SQLite DB。

我将有一个模块Bot::Plugins::Modes,它会有像kick和这样的方法voice。我像这样实例化Modes

$modes = new Bot::Plugins::Modes

我可以调用这样的方法:

$modes->voice(arg1 arg2);

在我的数据库中,我有字段modulemethod. 对于这个例子,模块和方法分别是modesvoice

侦听机器人命令的侦听器执行它们。我正在尝试做类似...

&{"$module->$method"}(arg1, arg2)

但我无法弄清楚语法。在它们可以通过模块加载并且只是我可以做的潜艇之前:

&{$command}(arg1, arg2)

$command数据库中的方法字段在哪里。在这种情况下,它只是“声音”,voice是一个子程序。

4

2 回答 2

4

类名和方法名都可以是标量。其余的语法是正常的。

my $module = "Foo";
my $method = "bar";

# Same as Foo->bar($arg1, $arg2);
$module->$method($arg1, $arg2);
于 2012-08-17T22:47:48.317 回答
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)。)

于 2012-08-17T22:48:31.863 回答