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

问题描述

假设我有

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...