子例程中的奇怪perl语法($$)

时间:2012-10-25 08:05:03

标签: perl

此代码中( $$ )的剂量是多少。我已经对Perl进行了很长时间的编程,但直到最近我打开一个非常旧的Perl .plx文件时才会遇到这种语法

这些行阻止我升级到更现代的Perl版本。

sub help( $$ ){

}

它影响我的原因是因为我收到一条错误消息,指出帮助函数在声明之前已被调用。知道怎么解决这个问题而不删除($$)块??

3 个答案:

答案 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的能力完全无关。