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

时间:2016-02-17 04:14:23

标签: perl subroutine

我构建了一个简单的子程序,我对是否需要括号进行调用有疑问。

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

当我使用

echo @ARGV

echo (@ARGV)

或(没有空格)

echo(@ARGV)
他们都工作了。哪一个是正确的?

2 个答案:

答案 0 :(得分:4)

在您的情况下,

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版本向后兼容的不幸副作用 - 请参阅this answer
    • 没有预先声明的情况下,最安全的方法是使用括号(虽然&echo @ARGV原则上工作,它绕过任何原型(参数类型的一种形式),该函数可能声明)。

至于惯例

  • 由于用户定义的函数使用括号始终(即使不是严格需要),但 >内置功能,有些人建议总是使用带有用户定义功能的括号,永远内置功能-in 功能。
    在符合此约定的源代码中,查看任何函数调用然后会告诉您是否正在调用内置函数或用户定义函数。

答案 1 :(得分:1)

parens是可选的。在某些情况下,您需要它们来显式显示哪些值是函数的参数,例如,在将函数调用的结果传递给另一个函数时:

myfunc(1, 2, otherfunc(3), "z");

如果没有围绕3的parens,otherfunc将同时收到3和&#34; z&#34;作为论点。

正如xxfelixxx所提到的,最好一直使用它们。