4

私が書いた多くのPerlモジュールを呼び出すためのディスパッチテーブルを構築することを検討しています。

Hello.pm例として、単純な関数を含むパッケージが呼び出されたhello()場合、この関数へのコード参照を取得したいと思います。

以下は機能しません。

my $code_ref=\&Hello->hello();
$code_ref->();

ただし、関数helloがパッケージからエクスポートされる場合、次のように機能します。

my code_ref=\&hello;
code_ref->();

誰かが最初のケースの正しい構文を知っていますか?それとも、これは単に不可能ですか?

最後に、すべてのコード参照をハッシュテーブルに入力したいと思います。

#####すべての回答をありがとう

いくつかの回答で指摘されている正しい呼び出しは次のとおりです。

my $code_ref=\&Hello::hello;
$code_ref->();

ディスパッチテーブルにロードしたい10個の異なるファイルに10個のモジュールがあります。これにより、構成をデータとしてロードし、コードから分離することが容易になります。これにより、コードを変更せずにテストベンチに追加のモジュールをロードできます。構成ファイルを変更するだけです。Higher OrderPerlの作者であるMarkDominusは、これに関するいくつかの良い例を持っています。

4

3 に答える 3

9

Helloモジュールでhellosubを参照する場合は、それを呼び出して、次を使用します。

my $code_ref = \&Hello::hello;
$code_ref->();

Helloで「hello」という名前のメソッドを呼び出す場合は、次のように実行できます。

my $method = "hello";
Hello->$method();
于 2012-12-29T01:42:23.943 に答える
7

\&NAMEサブへの参照を取ります。Hello->hello()サブ名ではありません。式としては、メソッド呼び出しになります。

メソッドへの参照を取得するには、を使用しますcan

my $method_ref = Hello->can('hello');

必要に応じて継承ツリーを検索します。適切なメソッドへの参照ができたので、次のように呼び出すことができます。

Hello->$method_ref()
  -or-
$method_ref->('Hello')

メソッドを適切に呼び出すことができないコールバックが必要な場合は、適切に呼び出すコールバックを作成する必要があります。

my $code_ref = sub { Hello->hello(@_) };

完全に動的に見えるものは次のとおりです。

my $pkg         = 'Hello';  # Also works with object!
my $method_name = 'hello';
my $method_ref  = $pkg->can($method_name);

my $callback = sub { $pkg->$method_ref(@_) };
于 2012-12-29T09:15:25.613 に答える
3

あなたがおそらく欲しいのは

my $code_ref = \&hello;
$code_ref->();
于 2012-12-29T00:57:19.233 に答える