2016-02-17 34 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工作,它繞過了函數可能聲明的任何原型(參數類型的一種形式))。

至於約定

  • 由於使用括號總是工作(即使不是嚴格需要)與用戶定義功能,而他們從來需要內置功能,有人推薦總是使用圓括號用戶自定義函數和從不使用使用內置函數。
    在遵守此約定的源代碼中,查看任何函數調用,然後告訴您是否正在調用內置函數或用戶定義的函數。
相關問題