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

14
задан Benjamin W. 3 November 2015 в 22:34
поделиться

5 ответов

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

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

 marine();

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

23
ответ дан 1 December 2019 в 06:18
поделиться
#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 намек, что морской является именем подпрограммы. Для меня, я признаю это быстрее как подпрограмму.

-121--2428996-

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

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

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

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

  1. визуальная согласованность с подпрограммами, которые действительно требуют параметров
  2. , ее нельзя спутать с другим ключевым словом.
7
ответ дан 1 December 2019 в 06:18
поделиться

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

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

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

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

4
ответ дан 1 December 2019 в 06:18
поделиться

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

печать "что-то" вместо печать ("что-то")

1
ответ дан 1 December 2019 в 06:18
поделиться

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

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:
15
ответ дан 1 December 2019 в 06:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: