我应该调用没有参数的Perl子例程作为marine()或marine吗?

时间:2010-01-13 13:30:41

标签: perl subroutine

根据下面的示例代码,调用子例程有两种样式:subnamesubname()

#!C:\Perl\bin\perl.exe
use strict;
use warnings;

use 5.010;

&marine(); # style 1
&marine; # style 2

sub marine {
    state $n = 0; # private, persistent variable $n
    $n += 1;
    print "Hello, sailor number $n!\n";
}

如果通话中没有参数,哪一个&marine();&marine;是更好的选择?

5 个答案:

答案 0 :(得分:23)

Learning Perl 中,这个例子来自于此,我们正在向您展示子例程。我们只告诉你使用&,这样你作为开始的Perler就不会遇到一个问题,你定义了一个与内置Perl同名的子程序然后想知道为什么它没有工作。前面的&始终调用您定义的子例程。初学者经常创建自己的子例程log来打印消息,因为他们习惯于使用他们使用的其他技术。在Perl中,这是内置的数学函数。

在您习惯使用Perl并了解Perl内置函数(扫描perlfunc)之后,请删除&&有一些你几乎不需要的特殊魔法:

 marine();

如果您已预先声明子例程,则可以不使用(),但我通常会将()留在那里,即使是空参数列表。由于您给Perl提示marine是子例程名称,因此它更加健壮。对我来说,我更快地认识到它是一个子程序。

答案 1 :(得分:15)

使用不带括号的&的副作用是使用@_调用子例程。这个程序

sub g {
  print "g: @_\n";
}
sub f {
  &g();   # g()
  &g;     # g(@_)
  g();    # g()
  g;      # g()
}
f(1,2,3);

生成此输出:

g:
g: 1 2 3
g:
g:

答案 2 :(得分:7)

首先使用sub关键字声明子例程,然后调用它们是一种很好的方式。 (当然there are ways around it,但为什么事情变得比必要的更复杂?)

除非您知道它对&以及使用原型声明的子例程的确切作用,否则不要使用@_语法。它非常模糊,很少需要,并且是通过意外行为造成的错误来源。请离开它 - Perl::Critic恰如其分地说:

从Perl 5开始,在调用子程序时,&符号是完全可选的。

现在,根据这些样式提示,我更喜欢调用样式1中不需要参数的子例程,即marine();。原因是

  1. 与需要参数的子程序的视觉一致性
  2. 不能与其他关键字混淆。

答案 3 :(得分:4)

作为一般规则,我建议如下:

  1. 除非你需要&因为你过度使用内置函数或没有参数列表省略它。

  2. 始终将()包含在marine()中。

  3. 我为了代码可读性而做了这两件事。当我通过使它们区分时覆盖内部Perl函数时,第一条规则就明确了。第二个是在我调用函数时明确的。

答案 4 :(得分:1)

perl允许您在函数调用中省略括号 所以你可以用两种不同的方式用参数调用你的函数:
your_function( arg1,arg2,arg3);

your function arg1,arg2,arg3 ;
选择哪种形式你更喜欢它。对于来自C background的用户,前者更直观 我个人使用前者用于我和后者定义的函数,用于内置函数,如:

print "something"代替print("something")