Согласно моему примеру кода ниже, существует два стиля для вызова подпрограммы: 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;
, состоит в том лучший выбор, при отсутствии аргументов в вызове?
В Обучение Perl , где приходит этот пример, мы в самом начале показывающих вам подпрограмм. Мы только говорим вам, чтобы использовать и
, чтобы вы, в качестве начала Perler, не столкнулись с проблемой, где вы определяете подпрограмму с тем же именем, что и встроенный Perl, тогда удивляешься, почему он не работать. &
впереди всегда вызывает ваш определенный подпрограмм. Начальные студенты часто создают свой собственный подпрограмм log
, чтобы распечатать сообщение, потому что они используются для этого в других технологиях, которые они используют. В Perl это математическая функция встроена.
После того, как вы привыкнете к использованию Perl, и вы знаете о встроенных Perl (сканирование через Perlfunc ), сбросьте и
. Есть особая магия с &
, что вам вряд ли когда-либо нужно:
marine();
Вы можете оставить ()
, если вы предварительно объявили подпрограмму, но я обычно оставляю ()
Там даже для пустого списка аргументов. Это немного более устойчивое, так как вы даете перл намек, что Marine
- это подпрограмма. Для меня я узнаю это быстрее как подпрограмма.
#include <algorithm>
template<class T>
T& trim(T& val) {
val = std::max(T(0), val);
return val;
}
Из вопроса не видно, что прохождение по ссылке non-const уместно. Вы можете изменить приведенный выше возврат ничего (void), передать по значению и вернуть по значению, или передать по const & и вернуть по значению:
template<class T>
T trim(T const& val);
// example use:
value = trim(value); // likely the most clear solution
Обобщить немного больше, даже если вне области вашего вопроса:
template<class T>
T constrain(T const& value, T const& lower, T const& upper) {
// returns value if value within [lower, upper] (inclusive end points)
// returns lower if value < lower
// otherwise returns upper
assert(lower <= upper); // precondition
return std::min(std::max(value, lower), upper);
}
template<class T>
T constrain_range(T const& value, T const& lower, T const& upper) {
// returns value if value within [lower, upper) (exclusive upper)
// returns lower if value < lower
// otherwise returns upper - 1
assert(lower < upper); // precondition
if (value < lower) return lower;
else if (value >= upper) return upper - 1;
else return value;
}
-121--4213572- В Learning Perl , где этот пример происходит, мы находимся в самом начале Мы только советуем вам использовать и
, чтобы вы, как начинающий Перлер, не столкнулись с проблемой, когда вы определяете подпрограмму с тем же именем, что и встроенный Perl, а затем задаетесь вопросом, почему она не работает. и
спереди всегда вызывает определенную подпрограмму. Начинающие студенты часто создают собственную подпрограмму регистраций
для печати сообщения, потому что они привыкли делать это в других используемых ими технологиях. В Perl это математическая функция builtin.
После того, как вы привыкли к использованию Perl и знаете о встроенных модулях Perl (сканировать через perlfunc ), удалите и
. Существует какая-то особая магия с и
, которая вам едва ли понадобится:
marine();
Вы можете оставить ()
, если вы заранее объявили подпрограмму, но я обычно оставляю ()
там даже для пустого списка аргументов. Это немного надежнее, так как вы даете Perl намек, что морской
является именем подпрограммы. Для меня, я признаю это быстрее как подпрограмму.
Рекомендуется сначала объявить подпрограммы с помощью ключевого слова sub
, а затем вызвать их. (Конечно, есть способы обойти его , но почему сделать вещи сложнее, чем необходимо?)
Не используйте синтаксис и
, если вы не знаете, что именно он делает с @ _
и подпрограммами, объявленными с прототипами. Она ужасно неясна, редко нужна и является источником ошибок из-за непреднамеренного поведения. Просто оставьте его подальше - Perl:: Критик метко говорит об этом:
Так как Perl 5, амперсанд сигил совершенно необязателен при вызове подпрограмм.
Теперь, следуя этим подсказкам стиля, я предпочитаю вызывать подпрограммы, которые не требуют параметров в 1 стиля, то есть marine ();
. Причинами являются
Как правило, я рекомендую следующее:
Если вам не понадобится и потому, что вы переживаете встроенную функцию или у вас нет списка параметров.
Всегда включайте () как в Морскойне ().
Я делаю оба из них для чтения кода. Первое правило проясняется, когда я переопределяю внутренние функции Perl, сделав их отчетливым. Второе делает его понятно, когда я вызываю функции.
жемчуг позволяет вам опускать круглую скобку в своем вызове функции.
Таким образом, можно вызвать функцию с аргументами двумя различными способами:
your_function (arg1, arg2, arg3);
или
ваша функция arg1, arg2, arg3;
вопрос выбора то, что формируется, делает вы предпочитаете. С пользователями происхождения C первый является более обладающим интуицией.
Я лично использую первого для функций, определяемых мной и последний для созданного в функциях как:
печать "что-то"
вместо печать ("что-то")
Побочный эффект использования и
без скобок заключается в том, что подпрограмма вызывается с помощью @_
. Эта программа
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: