我在以下情况下遇到问题。我正在编写一个使用AUTOLOAD
somtimes 从另一个模块(不是我的)调用函数的类。这个其他模块使用了一些定义原型的函数。一个例子是这样的:
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"}(@_);
或使用符号表的几个类似的东西。但是,问题是我如何将参数传递给该 call。如果在我的代码中我有:
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
我的模块中需要一个外部模块并将调用传递给实际原型的地方sub external_sub(\@$)
。问题是它会将接收到的参数作为@_
, where@arr
和'other_argument'
now 都作为单个列表的一部分传递。
有没有办法解决这样的情况?有没有办法检测出原来的论点是@_
什么?
请记住,我无法控制外部模块以及它使用原型函数的事实。
提前感谢您的任何评论!