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