У меня возникла проблема со следующим сценарием. Я пишу класс, который использует AUTOLOAD
для вызова функций из другого модуля (не моего). Этот другой модуль использует несколько функций, в которых определены прототипы. Одним из примеров такой:Как обрабатывать внешний прототип с локальным AUTOLOAD в Perl
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
в моем модуле потребуется внешний модуль и передать вызов к фактическому sub external_sub(\@$)
прототипу. Проблема в том, что он будет принимать полученные аргументы как @_
, где @arr
и 'other_argument'
теперь являются частью единого списка.
Есть ли способ решить такую ситуацию? Есть ли способ определить, каковы первоначальные аргументы, прежде чем стать @_
?
Имейте в виду, что я не контролирую внешний модуль и тот факт, что он использует прототипированную функцию.
Заранее благодарим за любые комментарии!
Я думаю, что ваш единственный вариант - предустановить все автозагружаемые функции. Что-то вроде 'sub external_sub (\ @ $);' где-то доступно во время _compile time_. –
Спасибо за комментарий. Возможно, вы правы. :-( –