【问题标题】:How can I test a signature violation without calling a perl function?如何在不调用 perl 函数的情况下测试签名违规?
【发布时间】:2020-12-29 08:48:30
【问题描述】:

假设我有,

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 读取签名,也可能有一种方法可以测试子例程是否使用特定签名声明?这个问题的答案可以用来回答这个问题。但是这个问题的答案可能无法回答那个问题。

【问题讨论】:

  • 也许更好的问题是,为什么要测试子程序是否正确使用?大多数 Perl 代码都可能被误用,需要有知识的用户来编写 Perl 代码。

标签: perl signature subroutine arity


【解决方案1】:

你能做的最好的就是尝试在 string-eval 中调用它:

$ 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,因为您需要捕获编译时错误。

【讨论】:

    【解决方案2】:

    来自 irc.freenode.net/#perl,

    15:06 EvanCarroll:是的,没有办法做到这一点either

    他说的是之前关于getting the signature of a function with an API的问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-16
      • 1970-01-01
      • 2022-07-24
      • 1970-01-01
      相关资源
      最近更新 更多