2016-02-17 35 views
1

我建立了一个简单的子程序,并且我有一个关于是否需要括号的问题。Perl子程序 - 它们是否需要用圆括号调用?

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

当我使用

echo @ARGV 

echo (@ARGV) 

或(无空格)

echo(@ARGV) 

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

+3

[TMTOWTDI](https://en.wikipedia.org/wiki/There%27s_more_than_one_way_to_do_it)? –

+1

'perldoc perlstyle'建议'函数名和它的左括号之间没有空格。“使用括号表明它是用户定义的函数,而不是内置函数。 – xxfelixxx

+1

@xxfelixxx:良好的信息空间,但要清楚:我假设你建议采用_convention_来调用所有用户定义的函数_with_小括号和内置_without_(但是,技术上,可以调用内置函数_can_ _with_小括号和用户定义的函数_can_可以被调用_without_括号,如果预先声明的话)。 – mklement0

回答

1

parens是可选的。你需要他们在某些情况下,以明确显示其值是函数的自变量,例如,传递结果时,一个函数调用另一个函数:

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

如果没有括号的3左右,otherfunc将同时接收3和“z”作为参数。

正如xxfelixxx提到的那样,最好始终使用它们。

3

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不够)。
    • 此preclare要求是与最早的Perl版本向后兼容的一个不幸的副作用 - 见this answer
    • 没有预先声明,最安全的方法是使用括号(原则上&echo @ARGV工作,它绕过了函数可能声明的任何原型(参数类型的一种形式))。

至于约定

  • 由于使用括号总是工作(即使不是严格需要)与用户定义功能,而他们从来需要内置功能,有人推荐总是使用圆括号用户自定义函数和从不使用使用内置函数。
    在遵守此约定的源代码中,查看任何函数调用,然后告诉您是否正在调用内置函数或用户定义的函数。
相关问题