4

( $$ )在这段代码中做了什么。我已经编写 Perl 很长时间了,但直到最近我打开一个非常旧的 Perl .plx 文件时才遇到这种语法

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

sub help( $$ ){

}

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

4

3 回答 3

8

被称为原型。这个特定的说,子例程期望使用恰好 2 个标量变量来调用。尽管原型有时很有用,但大多数情况下没有用。

如果你可以删除它们取决于代码的其余部分......

于 2012-10-25T08:10:48.430 回答
7

那是一个函数原型,用于指定子例程采用的参数的数量和类型。请参阅文档

由于它在当前文档中,我不明白为什么它会阻止您升级。

你得到的错误是help called too early to check prototype什么?这是perldiag文档中的解释:

(W 原型)在解析器看到它的定义或声明之前,您已经调用了一个具有原型的函数,而 Perl 无法检查该调用是否符合原型。您需要为相关子例程添加早期原型声明,或者将子例程定义移动到调用之前以进行正确的原型检查。或者,如果您确定您正确调用了该函数,您可以在名称前添加一个 & 号以避免警告。请参阅 perlsub。

于 2012-10-25T08:11:35.257 回答
2

这是一个原型$$指定函数需要两个参数,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 的能力完全无关。

于 2012-10-25T17:23:24.880 回答