Вы НЕ добавляете указатель на функцию в свой массив.Вы добавляете возвращаемое значение вызова подпрограммы add_page ().У вас есть 3 решения для этого:
A.Вам нужно будет сохранить (в @functions
) массив arrayrefs вида [\&OSA::SQL::add_page, @argument_values]
, что означает, что вы передаете фактическую ссылку на подпрограмму (называемую статически);и затем exec_multi сделает что-то вроде (синтаксис может быть не на 100% правильным, так как здесь 4 утра)
sub exec_multi {
my ($class, $funcs)= @_;
foreach my $f (@$funcs) {
my ($func, @args) = @$f;
my $res = &$func(@args);
print "RES:$res\n";
}
}
Просто для повторения, это вызовет отдельные подпрограммы в статической версии (OSA::SQL::add_page
), напримерБЕЗ передачи имени пакета в качестве первого параметра как вызов класса OSA::SQL->add_page
.Если вы хотите последнее, см. Следующее решение.
B.Если вы хотите вызывать ваши подпрограммы в контексте класса (как в вашем примере, другими словами, с именем класса в качестве первого параметра), вы можете использовать предложение ysth в комментарии.
Вам нужно будет сохранить (в @functions
) массив arrayrefs вида [sub { OSA::SQL->add_page(@argument_values) }]
, означающий, что вы передаете ссылку на подпрограмму, которая в свою очередь вызовет то, что вам нужно;и тогда exec_multi сделает что-то вроде (синтаксис может быть не на 100% правильным, так как здесь 4 утра)
sub exec_multi {
my ($class, $funcs)= @_;
foreach my $f (@$funcs) {
my ($func) = @$f;
my $res = &$func();
print "RES:$res\n";
}
}
C.Вам нужно будет сохранить (в @functions
) массив arrayrefs вида [ "OSA::SQL", "add_page", @argument_values]
, то есть вы передадите имя пакета и функции;и тогда exec_multi сделает что-то вроде (синтаксис может быть не на 100% правильным, так как здесь 4 утра)
my ($package, $sub, @args) = @{ $functions[$i] };
no strict 'refs';
$package->$sub(@args);
use strict 'refs';