我有一个函数正在调用另一个函数并在其中传递参数。其中一个参数是存储在变量中的函数。当我试图在另一个函数中调用该函数时,它抛出了一个错误。
my @tst1 = ("tst1 - Checking Whether the naming format of created Directory by using tar ball is same as expected in the format of trustid_web_ yyyyMMdd-HHmmss.tar.gz and same as tar ball", "runCmd()");
@tstInfo = (@tst1);
sub populatetestCb() {
for ($i = 0; $i <= $ #tstInfo; $i++) {
$testCb {
$i + 1
} = $tstInfo[$i];
}
}
populatetestCb();
$startTime = localtime();
my $tmp = 1;
while (1) {
my $ret = getTestDetails($tmp);
if ($ret eq 1) {
$tStartTime = localtime();
my $tstRes = runTest($tstDes, $tstFunction);
$tEndTime = localtime();
#PRINT_LOG("runTest returned $tstResn");
$tmp++;
sleep(2);
} else {
last;
}
}
sub runTest {
$tstName = $_[0];
my $tstFunction = $_[1];
print($tstFunction);
my $action = & $tstFunction;
$action - > ();
}
当我在runTest
函数中调用$action->()
时,它正在抛出
Undefined subroutine &main::runCmd() called at testAutomation.pl line 83.
my @tst1
是一个数组,它包含测试描述和测试它所需调用的函数。populateTestCb
是存储它的散列,我正在getTestDetails
函数中访问它,我想从那里调用runTest
并将特定函数调用到它中。
如果不严格,按名称调用函数通常有效:
no strict;
my $name = 'func';
$name->() and print 'ok'; # ok
sub func { 1 }
在严格的情况下,这仍然是可能的,但需要额外的步骤。不过,除了AUTOLOAD之外,它不应该用于任何事情。
my $name = 'func';
my $f = &{$name};
$f->() and print 'ok'; # ok
通常,您会将子例程引用存储在变量中,然后再调用它:
my $func = &func;
$func->() and print 'ok'; # ok