Должен ли я вызывать подпрограммы 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")