次のシナリオで問題が発生しています。somtimesを使用しAUTOLOAD
て別のモジュール (私のものではない) から関数を呼び出すクラスを作成しています。この他のモジュールは、プロトタイプが定義されているいくつかの関数を使用します。一例はこれです:
sub external_sub (\@$) { ... }
これらの関数は、次のような呼び出しを使用して、そのモジュールから直接インポートすると正しく機能します。
my @arr = (1..10);
external_sub(@arr, 'something else');
さて、実行時にクラスから外部モジュールを要求し、その関数をインポートするときに発生する問題は、適切な引数を渡す方法が見つからないことです。
私のAUTOLOAD
関数の中で、私は頼りにする@_
だけで、最初の引数として に渡された配列を区別する方法が Perl にあるかどうかさえわかりませんAUTOLOAD
。したがって、内部AUTOLOAD
で、これまでに呼び出しをリダイレクトするために考えられる唯一のオプションは次のとおりです。
no strict 'refs';
my $sym = *{"ExternalModule\::$called_sub"};
*$AUTOLOAD = $sym;
goto &$AUTOLOAD;
...または次のようなもの:
no strict 'refs';
return &{"ExternalModule\::$called_sub"}(@_);
またはシンボルテーブルを使用したいくつかの同様のもの。ただし、問題はその呼び出しに引数を渡す方法です。私のコードにある場合:
package main;
use strict;
use MyModule qw(:some_external_subs); # This will import *names only but will decide later from which modules to take the actual code refs
# Here I have imported the sub 'external_sub' as symbol but it won't be actually loaded until MyModule::AUTOLOAD decides which external module will actually use to import the code for that function:
my @arr = ('some', 'values');
my $result = external_sub(@arr, 'other_argument');
次に、それがAUTOLOAD
私のモジュールで外部モジュールを必要とし、呼び出しを実際のprototypedに渡すポイントsub external_sub(\@$)
です。問題は、受け取った引数を として渡すことです@_
。ここで、@arr
と'other_argument'
はすべて単一のリストの一部になりました。
このような状況を解決する方法はありますか? になる前に元の引数が何であったかを検出する方法はあり@_
ますか?
私は外部モジュールを制御できないこと、およびそれがプロトタイプ関数を使用しているという事実に注意してください。
コメントをお寄せいただきありがとうございます。