如何在不调用 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,因为您需要捕获编译时错误。
假设我有,
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
需要一个参数。没有 运行 该代码,有没有办法做到这一点。
我认为这个问题与
来自 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,因为您需要捕获编译时错误。