Должен ли я вызывать подпрограммы Perl без аргументов как marine () или marine? - PullRequest
14 голосов
/ 13 января 2010

Согласно моему примеру кода ниже, есть две стили для вызова подпрограммы: subname и subname().

#!C:\Perl\bin\perl.exe
use strict;
use warnings;

use 5.010;

&marine(); # style 1
&marine; # style 2

sub marine {
    state $n = 0; # private, persistent variable $n
    $n += 1;
    print "Hello, sailor number $n!\n";
}

Какой из них, &marine(); или &marine;, лучшевыбор, если в вызове нет аргументов?

Ответы [ 5 ]

23 голосов
/ 13 января 2010

В Изучение Perl , откуда берется этот пример, мы в самом начале показываем вам подпрограммы. Мы только советуем вам использовать &, чтобы вы, как начинающий Perler, не столкнулись с проблемой, когда вы определяете подпрограмму с тем же именем, что и встроенный в Perl, а затем удивляетесь, почему она не работает. & перед всегда вызывает вашу определенную подпрограмму. Начинающие студенты часто создают собственную подпрограмму log для печати сообщения, потому что они привыкли делать это в других технологиях, которые они используют. В Perl это встроенная математическая функция.

После того, как вы привыкнете использовать Perl и узнаете о встроенных модулях Perl (сканирование через perlfunc ), отбросьте &. Есть некоторая особая магия с &, которая вам вряд ли когда-нибудь понадобится:

 marine();

Вы можете отменить (), если вы предварительно объявили подпрограмму, но я обычно оставляю () там даже для пустого списка аргументов. Это немного более надежно, поскольку вы даете Perl намек на то, что marine - это имя подпрограммы. Для меня, я распознаю это быстрее как подпрограмму.

15 голосов
/ 13 января 2010

Побочным эффектом использования & без скобок является то, что подпрограмма вызывается с @_. Эта программа

sub g {
  print "g: @_\n";
}
sub f {
  &g();   # g()
  &g;     # g(@_)
  g();    # g()
  g;      # g()
}
f(1,2,3);

производит этот вывод:

g:
g: 1 2 3
g:
g:
7 голосов
/ 13 января 2010

Это хороший стиль - сначала объявлять подпрограммы с ключевым словом sub, а затем вызывать их.(Конечно, есть способы обойти это , но зачем делать вещи более сложными, чем необходимо?)

Не используйте синтаксис &, если вы не знаете, что именно он делает с @_и подпрограммы, объявленные с прототипами.Это ужасно малоизвестно, редко требуется и является источником ошибок из-за непреднамеренного поведения.Просто оставьте это в стороне - Perl :: Critic удачно говорит об этом:

Начиная с Perl 5, символ амперсанда совершенно необязателен при вызове подпрограмм.

ТеперьСледуя этим советам по стилю, я предпочитаю вызывать подпрограммы, которые не требуют параметров в стиле 1, то есть marine();.Причины:

  1. визуальная согласованность с подпрограммами, для которых требуются параметры
  2. , его нельзя спутать с другим ключевым словом.
4 голосов
/ 13 января 2010

Как правило, я рекомендую следующее:

  1. Если вам не нужен символ &, потому что вы перешли на встроенную функцию или у вас нет списка параметров, пропустите его.

  2. Всегда включайте (), как в морском ().

Я делаю оба из них для удобства чтения кода. Первое правило проясняет, когда я переопределяю внутренние функции Perl, выделяя их. Вторая проясняет, когда я вызываю функции.

1 голос
/ 13 января 2010

perl позволяет опустить скобки в вызове функции.
Таким образом, вы можете вызывать вашу функцию с аргументами двумя различными способами:
your_function( arg1,arg2,arg3);
или
your function arg1,arg2,arg3 ;
Еевопрос выбора того, какую форму вы предпочитаете.С пользователями из C фона первый более интуитивно понятен.
Я лично использую первый для определенных мной функций, а второй для встроенных функций, таких как:

print "something" вместо print("something")

...