14

根据我下面的示例代码,调用子例程有两种样式: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;

4

5 回答 5

23

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

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

 marine();

()如果您已经预先声明了子例程,您可以省略,但我通常会离开()那里,即使是一个空的参数列表。marine由于您向 Perl 暗示这是一个子例程名称,因此它更加健壮。对我来说,我更快地认识到这是一个子程序。

于 2010-01-13T13:55:09.357 回答
15

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

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

产生这个输出:

G:
克:1 2 3
G:
G:
于 2010-01-13T15:37:57.307 回答
7

最好先用sub关键字声明子程序,然后调用它们。(当然有办法绕过它,但为什么要让事情变得比必要的更复杂呢?)

不要使用该&语法,除非您知道它对@_原型声明的子程序和子程序的确切作用。它非常晦涩,很少需要,并且是通过意外行为引起的错误来源。别管它——Perl ::Critic恰当地说:

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

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

  1. 与需要参数的子程序的视觉一致性
  2. 它不能与不同的关键字混淆。
于 2010-01-13T13:55:37.390 回答
4

作为一般规则,我建议以下内容:

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

  2. 始终在 Marine() 中包含 ()。

为了代码的可读性,我做了这两个。当我通过区分内部 Perl 函数来覆盖它们时,第一条规则就很清楚了。当我调用函数时,第二个很清楚。

于 2010-01-13T15:19:31.557 回答
1

perl 允许您在函数调用中省略括号。
因此,您可以通过两种不同的方式使用参数调用您的函数:
your_function( arg1,arg2,arg3);
或者您可以
your function arg1,arg2,arg3 ;
选择您喜欢哪种形式。对于来自 C 背景的用户,前者更直观。
我个人将前者用于我定义的函数,后者用于内置函数,例如:

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

于 2010-01-13T14:05:34.180 回答