如何在不调用 perl 函数的情况下测试签名违规?

How can I test a signature violation without calling a perl function?

假设我有,

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 需要一个参数。没有 运行 该代码,有没有办法做到这一点。


我认为这个问题与 不同,因为即使我无法通过某种 Perl API 读取签名,也可能有一种方法可以测试是否声明了子例程有特定的签名?这个问题的答案可以用来回答这个问题。但是这个问题的答案可能无法回答那个问题。

来自 irc.freenode.net/#perl,

15:06 < Grinnz> EvanCarroll: yes, there's no way to do that

他说的是之前关于 的问题。

您最好的办法就是尝试在字符串求值中调用它:

$ perl -E 'sub foo ($bar) { return $bar } eval "foo()"; print "error: $@"'
error: Not enough arguments for main::foo at (eval 1) line 1, near "()
"

它需要是 string-eval,而不是 block-eval,因为您需要捕获编译时错误。