问题描述
假设我有,
use experimental 'signatures';
sub foo ($bar) { return 0 };
现在,如果我在没有正确的arity的情况下调用它,将会收到错误消息。
# Too few arguments for subroutine 'main::foo'
foo()
# Too many arguments for subroutine 'main::foo'
foo(1,2);
但是,我该如何测试。假设我要确保有人实现了package Bar
,以使其功能foo
需要一个参数。有没有一种方法可以执行而无需运行该代码。
我认为这个问题与my other question不同,因为即使我无法通过某种Perl API读取签名,也可能有一种方法可以测试使用特定签名声明的子例程?这个问题的答案可以用来回答这个问题。但是对此问题的答案可能无法回答那个问题。
解决方法
来自irc.freenode.net/#perl,
15:06
EvanCarroll:是的,没有办法either
他是指先前关于getting the signature of a function with an API的问题。
,你能做的最好的事情就是尝试在字符串评估中调用它:
$ perl -E 'sub foo ($bar) { return $bar } eval "foo()"; print "error: $@"'
error: Not enough arguments for main::foo at (eval 1) line 1,near "()
"
它需要是一个字符串-eval,而不是一个块-eval,因为您需要捕获编译时错误。