Является ли использование меток в подпрограммах Perl плохой практикой? - PullRequest
9 голосов
/ 28 октября 2009

Я считаю, что использование меток внутри подпрограмм Perl для прерывания нескольких циклов или для повторения некоторых частей с обновленными переменными очень полезно. Как этот стиль кодирования рассматривается сообществом? Не одобряется ли использование меток внутри подпрограмм?

Ответы [ 3 ]

17 голосов
/ 28 октября 2009

Нет. Они служат именно той цели, которую вы описываете, и я считаю их отличной чертой языка, который слишком мало используется.

С другой стороны, всякий раз, когда я размышляю над использованием метки, я также задаюсь вопросом, нуждается ли мой код в небольшом рефакторинге.

12 голосов
/ 28 октября 2009

Использование меток с next, last и redo - это нормально, но вы должны остановиться, чтобы рассмотреть, является ли структура кода наилучшей. По моему опыту, вам редко нужно использовать эти операторы для чего-либо, кроме замкнутого цикла (что означает, что вам не нужно использовать метку).

Использование goto LABEL настоятельно не рекомендуется.

8 голосов
/ 28 октября 2009

Обычно нет причин использовать goto LABEL.

Например:

my $i = 10;
Label:
# ...
goto Label if --$i;

Лучше записывается как:

my $i = 10;
{
  # ...
  redo if --$i;
}

Единственная причина, по которой я могу придумать, использовать метку, это разорвать несколько циклов или продолжить внешний цикл.

my $i = 10;
OUTER: while(1){
  # ...
  while(1){
    # ...
    last OUTER unless --$i;
  }
}
my $i = 10;
OUTER: {
  # ...
  {
    # ...
    redo OUTER if --$i;
  }
}
...