我正在用Perl开发一个测试框架。作为测试的一部分,我可能需要为任何给定的测试添加前置条件或后置条件检查,但不一定为所有测试添加前置条件或后置条件检查。到目前为止,我得到的结果是这样的:
eval "&verify_precondition_TEST$n";
print $@ if $@;
不幸的是,这将输出“未定义的子例程&verify_precondition_TEST1调用于...”如果函数不存在。
在尝试调用函数之前,如何提前确定该函数是否存在?
发布于 2009-01-11 13:49:10
使用已定义的:
if (eval "defined(&verify_precondition_TEST$n)") {
eval "&verify_precondition_TEST$n";
print $@ if $@;
}
else {
print "verify_precondition_TEST$n does not exist\n";
}
编辑:嗯,我只想到了这个问题中的eval,但是关于Leon Timmerman提到的符号引用,你不能这样做吗
if (defined(&{"verify_precondition_TEST$n"}) {
&{"verify_precondition_TEST$n"};
print $@ if $@;
}
else {
print "verify_precondition_TEST$n does not exist\n";
}
即使是严格的?
发布于 2009-01-11 13:43:14
Package::Name->can('function')
或
*Package::Name::function{CODE}
# or no strict; *{ "Package::Name::$function" }{CODE}
或者只是生活在异常中。如果在eval中调用该函数并且设置了$@,则不能调用该函数。
最后,听起来您可能希望使用Test::Class,而不是自己编写。
编辑:在其他答案中提到的defined &function_name
(或no strict; defined &{ $function_name }
变体)看起来是最好的方法。对于要作为方法调用的东西,UNIVERSAL::can是最好的(从风格上讲),既然Perl提供了执行所需的语法,为什么还要费心修改符号表呢?
Learning++ :)
发布于 2009-01-11 17:21:49
sub function_exists {
no strict 'refs';
my $funcname = shift;
return \&{$funcname} if defined &{$funcname};
return;
}
if (my $subref = function_exists("verify_precondition_TEST$n") {
...
}
https://stackoverflow.com/questions/433752
复制