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 に答える