为什么我的Perl代码中出现"过早调用原型"警告?

use*_*457 12 perl subroutine

我有一个像这样的Perl文件:

use strict;
f1();

sub f3()
{ f2(); }

sub f1()
{}
sub f2()
{}
Run Code Online (Sandbox Code Playgroud)

简而言之,f1在定义之前被调用.因此,Perl发出警告:"f1过早调用原型".但情况也是如此f2,唯一的区别是它是从另一个子程序内部调用的.它不会发出警告f2.为什么?

解决此问题的最佳方法是什么?

  1. 在调用子例程之前声明子例程
  2. 像这样调用sub: &f1();

Sin*_*nür 16

您可以通过不首先使用原型来完全避免此问题:

use strict;

f1();

sub f3 { f2() }

sub f1 {}
sub f2 {}
Run Code Online (Sandbox Code Playgroud)

除非您知道原因,否则不要使用原型:

当然,这一切都非常强大,应该只在适度的情况下使用才能让世界变得更美好.

  • @jheddings:你错过了这一点:Perl的原型是99%,*不是一个有用的功能*.他们使代码*更糟*.不相信我?阅读http://groups.google.com/group/comp.lang.perl.modules/msg/84484de5eb01085b?dmode=source&output=gplain&pli=1.perl中唯一有用的原型是`(&; @)`. (5认同)
  • @Chris Lutz:啊,但经验丰富且知识渊博的用户可以忽视"不要使用X"的注意事项; 他们是为了无经验和/或不可知的. (5认同)
  • @Nathan,不,解决方案根本不使用`()`原型,因为它最有可能完全没有原因. (4认同)
  • 我不喜欢“不要使用原型”这一点。他们有时在某些事情上非常友善。 (2认同)

har*_*guy 11

只需从子例程定义中删除()即可.当您使用()定义时,Perl认为这些是原型,您必须在使用之前定义原型.

试试这个......

use strict;
f1();

sub f3
{ f2(); }

sub f1
{}
sub f2
{}
Run Code Online (Sandbox Code Playgroud)


小智 5

在 Perl 中定义函数时不应使用括号。当您这样做时,您会收到此错误。这是错误的:

sub DoSomthing(){
   #do what ever...
}
Run Code Online (Sandbox Code Playgroud)

这是要走的路:

sub DoSomthing{
   #do what ever...
}
Run Code Online (Sandbox Code Playgroud)

没有括号。

有关更详细的说明,请参阅 Gabor Szabo 的 Perl Maven 页面,了解 Perl 中的子例程和函数。 https://perlmaven.com/subroutines-and-functions-in-perl