perl中prototype的含义是什么?

时间:2017-10-17 16:49:25

标签: perl

我正在编写代码,但错误为Prototype after '%' for main::compareHashes。我不知道什么是原型,在网上查看大量文档后我仍然感到困惑。有人可以解释一下吗?

2 个答案:

答案 0 :(得分:3)

你有类似

的东西
(%$)

compareHashes是原型。 Prototypes会影响对sub的调用的解析方式。

至于您收到的错误,perldiag提供了以下说明:

  

字符在原型中跟随%或@。这是没用的,因为%和@ gobble其余的子例程参数。

无论你使用什么原型都没有意义,这是Perl告诉你的方式。您需要修复或删除example = lambda: 'example' # noqa: E731,E123 的原型。

答案 1 :(得分:1)

查看your previous question,您的原型就是:

sub compareHashes(%$hash1, %$hash2) { ... }

作为原型,这是无稽之谈。也许你应该阅读the documentation on prototypes

Perl中的原型完全不同于任何其他语言的原型。这就是专业Perl程序员不推荐使用它们的原因(在极少数用例必不可少的情况下)。 Perl的最新版本添加了一个名为function signatures的新功能,它更像大多数人期望的原型 - 但它们目前被标记为实验性功能,因此没有多少人使用它们。

但是,让我们看看你的原型,看看它有什么问题。

sub compareHashes(%$hash1, %$hash2) { ... }

首先,它包含看起来像变量名的内容。 Perl原型不包含变量名。它们只是一串符号,用于描述要传递给子例程的参数类型。

但是解析器并没有抱怨变量名。它没有到达第一个变量名。它在此之前发现了一个问题。它不喜欢%$。那是因为%$没有意义作为原型。

%$表示“这个子程序有两个参数 - 一个哈希后跟一个标量。但我们(应该!)知道将标量传递给子程序 是没有意义的哈希。那是因为哈希分配是贪婪的,并且会占用@_中所有剩余的参数 - 不会留下任何标量。

你说你将这样调用子程序:

some_sub(%hash, $scalar);

在子程序中,你会这样做:

my (%hash, $scalar) = @_;

那就行不通。这就是错误告诉你的。你的原型是胡说八道。

不要使用原型。原型并不像你认为的那样工作。它们是高级Perl功能,只能在特定情况下使用。

更新:我刚才在你的问题中注意到这一点:

  

我不知道什么是原型

原型是子程序名称和子程序块之间括号中的位。在子例程定义中:

sub compareHashes(%$hash1, %$hash2) { ... }

原型是(%$hash1, %$hash2)。我知道为什么人们使用它们 - 它们看起来很像子程序在其他语言中的工作方式,但在Perl中,它们通常比它们的价值要麻烦得多。最好只删除它们,然后在没有原型的情况下定义子程序:

sub compareHashes { ... }