Perl子例程-是否需要用括号调用它们?

cap*_*ser 3 perl subroutine

我建立了一个简单的子例程,并且对调用它是否需要括号有疑问。

#!/usr/bin/perl
sub echo {
    print "@_ \n" ;
}
echo(@ARGV);
Run Code Online (Sandbox Code Playgroud)

当我使用

echo @ARGV
Run Code Online (Sandbox Code Playgroud)

要么

echo (@ARGV)
Run Code Online (Sandbox Code Playgroud)

或(无空格)

echo(@ARGV)
Run Code Online (Sandbox Code Playgroud)

他们都工作。哪一个是正确的?

mkl*_*nt0 5

echo @ARGVecho (@ARGV)以及echo(@ARGV)在技术上在你的情况是正确的,但使用括号有时必要的 ; 除此之外,这是一个选择问题,有些人在何时使用哪种样式方面采用了约定

  • 将整个参数列表包含在括号中总是可行的 -空格是否在左括号之前- echo (@ARGV)echo(@ARGV)-以及是否要调用内置函数或用户定义的函数(子例程):

    • 正如@xxfelixxx在对该问题的评论中指出的那样,perldoc perlstyle建议在函数名和- 之间不要使用空格。(echo(@ARGV)
    • 将整个参数列表括在括号中消除歧义
      • print (1 + 2) + 4仅打印3,因为它(1 + 2)被解释为整个参数列表(+ 4添加到print调用的表达式值中,但不输出结果)。
      • print((1 + 2) + 4)解决歧义并打印7
      • 或者,在带括号的第一个参数前面加上前缀+以实现相同的效果:print +(1 + 2) + 4也显示7
  • 使用括号 -echo @ARGV-作品:

    • 内置功能:总是
    • 具有用户定义的功能:仅在预先声明的情况下,可以通过以下方式之一来确保:
      • 该函数在调用在同一脚本中定义
      • 该函数前置声明sub <name>; 之前的调用。
      • 该函数是调用之前从模块导入的(不够)。use require
    • 此预声明要求是与最早的Perl版本向后兼容的不幸副作用-请参阅此答案
    • 没有预先声明情况下,最安全的方法是使用括号&echo @ARGV原则上可以使用,但是绕过了函数可能声明的所有原型(参数类型的一种形式)。

至于约定

  • 由于使用括号总是工作(即使不是严格需要)与用户定义的函数,而绝不会他们需要内置功能,有些人建议经常使用带括号的用户定义的函数,并且从未使用内置的功能。
    在遵循该约定的源代码中,查看任何函数调用即可告诉您是正在调用内置函数还是用户定义的函数。