Подпрограммы Perl - нужно ли их вызывать со скобками?

Я создал простую подпрограмму, и у меня есть вопрос, нужны ли скобки для ее вызова.

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

Когда я использую

echo @ARGV

or

echo (@ARGV)

или (без пробела)

echo(@ARGV)

все они работают. Который правильный?


person capser    schedule 17.02.2016    source источник
comment
TMTOWTDI?   -  person Benjamin W.    schedule 17.02.2016
comment
perldoc perlstyle рекомендует No space between function name and its opening parenthesis. Использование круглых скобок дает понять, что это функция, определяемая пользователем, а не встроенная.   -  person xxfelixxx    schedule 17.02.2016
comment
@xxfelixxx: Хорошая информация о пространстве, но для ясности: я предполагаю, что вы рекомендуете принять соглашение о вызове всех определяемых пользователем функций с круглыми скобками и встроенных - ins без (технически, однако, встроенные модули могут вызываться с круглыми скобками, а пользовательские функции могут называться без круглых скобок, если заявлено заранее).   -  person mklement0    schedule 17.02.2016
comment
Связанный вопрос, который некоторые считают дубликатом этого вопроса, имеет другую направленность: связанный вопрос знает, при каких обстоятельствах нужны круглые скобки, и спрашивает почему это так. Напротив, этот вопрос спрашивает о том, нужны ли круглые скобки, имеет ли значение пробел перед открывающими скобками и когда выбирать, какой стиль вызова.   -  person mklement0    schedule 17.02.2016
comment
@ mklement0 Согласен, проголосовал за открытие. Я очень удивлен, что для этого нет подходящего дубликата.   -  person ThisSuitIsBlackNot    schedule 17.02.2016


Ответы (2)


echo @ARGV, echo (@ARGV) и echo(@ARGV) технически все верны в вашем случае, но использование скобок иногда необходимо; кроме того, это вопрос выбора, и некоторые люди используют условные обозначения, когда использовать какой стиль.

  • Заключение всего списка аргументов в круглые скобки ВСЕГДА работает - независимо от того, предшествуют ли пробелы открывающей скобке - echo (@ARGV) или echo(@ARGV) - и вызываете ли вы встроенную или определяемую пользователем функцию (подпрограмму):

    • As @xxfelixxx notes in a comment on the question, perldoc perlstyle recommends no spaces between the function name and ( - echo(@ARGV).
    • Enclosing the entire argument list in parentheses can be used to disambiguate:
      • print (1 + 2) + 4 prints only 3, because (1 + 2) is interpreted as the entire argument list (with + 4 added to the the expression value of the print call, the result of which is not output).
      • print((1 + 2) + 4) устраняет двусмысленность и печатает 7.
      • Либо добавьте к первому аргументу в скобках префикс + для достижения того же эффекта: print +(1 + 2) + 4 также печатает 7.
  • Без скобок - echo @ARGV - работает:

    • with built-in functions: always
    • with user-defined functions: ONLY if they are predeclared, which can be ensured in one of the following ways:
      • The function is defined in the same script before its invocation.
      • Функция объявлена ​​вперед с sub <name>; перед ее вызовом.
      • Функция импортируется из модуля с use перед вызовом (require недостаточно).
    • Это предварительное требование является нежелательным побочным эффектом обратной совместимости с самыми ранними версиями Perl - см. этот ответ.
    • При отсутствии предварительного объявления наиболее безопасным подходом является использование круглых скобок (хотя &echo @ARGV в принципе работает, он обходит любые прототипы (форма набора параметров), которые функция может объявлять).

Что касается условностей:

  • Поскольку использование круглых скобок всегда работает (даже если это не является строго необходимым) с определяемыми пользователем функциями, тогда как они никогда не необходимы для встроенных - в функциях некоторые люди рекомендуют всегда использовать круглые скобки с определяемыми пользователем функциями и никогда с встроенными < / em> functions.
    В исходном коде, который придерживается этого соглашения, просмотр любого вызова функции затем сообщает вам, вызывается ли встроенная или определяемая пользователем функция.
person mklement0    schedule 17.02.2016

Парены необязательны. Они нужны вам в некоторых ситуациях, чтобы явно показать, какие значения являются аргументами функции, например, при передаче результата вызова функции другой функции:

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

Без скобок вокруг 3 otherfunc получит в качестве аргументов и 3, и «z».

Как упоминалось xxfelixxx, лучше использовать их все время.

person Andy Schweig    schedule 17.02.2016