Должен ли я вызывать подпрограммы Perl без аргументов в качестве морских() или морских?

В соответствии с моим примером кода ниже для вызова подпрограммы используются два стиля: 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;, лучший выбор, если в вызове нет аргументов?

Ответы

Ответ 1

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

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

 marine();

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

Ответ 2

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

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:

Ответ 3

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

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

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

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

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

Ответ 4

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

  • Если вам это не нужно, и потому, что вы закончили работу встроенной функции или у вас нет списка параметров, опустите его.

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

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

Ответ 5

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

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