此代码中( $$ )
的剂量是多少。我已经对Perl进行了很长时间的编程,但直到最近我打开一个非常旧的Perl .plx文件时才会遇到这种语法
这些行阻止我升级到更现代的Perl版本。
sub help( $$ ){
}
它影响我的原因是因为我收到一条错误消息,指出帮助函数在声明之前已被调用。知道怎么解决这个问题而不删除($$)块??
答案 0 :(得分:8)
被称为prototypes。这个特殊的一个说,子例程期望用恰好2个标量变量调用。虽然原型有时很有用,但大部分都不是。
如果你可以删除它们取决于代码的其余部分......
答案 1 :(得分:7)
这是一个函数原型,用于指定子例程所采用的参数的数量和类型。请参阅documentation。
由于它在当前文档中,我不明白为什么它阻止您升级。
您收到的错误是help called too early to check prototype
吗?以下是perldiag文档中的解释:
(W原型)在解析器看到定义或声明之前,你已经调用了一个具有原型的函数,Perl无法检查调用是否符合原型。您需要为相关子例程添加早期原型声明,或者在调用之前移动子例程定义以获得正确的原型检查。或者,如果您确定正在正确调用该功能,则可以在名称前加上&符以避免警告。见perlsub。
答案 2 :(得分:2)
这是一个prototype。 $$
指定help
函数需要两个参数,并且每个参数都应在标量上下文中进行评估。请注意,此不表示它们是标量值! Perl的原型与其他语言的原型不同。它们允许您定义与内置函数类似的函数:括号是可选的,上下文强加于参数。
sub f($$) { print "@_\n" }
my @a = ('a' .. 'c');
f(@a, 'd'); # prints "3 d"
我猜你看到的错误信息是
help() called too early to check prototype
这意味着Perl在看到函数声明并知道原型之前就看到了对该函数的调用。这意味着原型未得到强制执行,并且调用可能无法按预期运行。
my @a = ('a' .. 'c');
f(@a, 'd'); # prints "a b c d"
sub f($$) { print "@_\n" }
要修复错误,您需要在调用之前移动子例程定义,或者在调用之前添加声明。
sub f($$); # forward declaration
my @a = ('a' .. 'c');
f(@a, 'd'); # prints "3 d"
sub f($$) { print "@_\n" }
所有这一切都与您升级到新版Perl的能力完全无关。