2009-10-28 2 views
9

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

ответ

17

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

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

+1

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

+2

Иногда это происходит, иногда это не так. Я всегда использую код, который легче читать и понимать. Иногда это код, который использует метки. – innaM

+2

Perl Best Practices поддерживает этикетки. Я не согласен со всем PBP, но я думаю, что это один из его полезных советов. Они служат документацией, если ничего другого. – hobbs

12

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

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

8

Обычно нет причин использовать 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; 
    } 
} 
Смежные вопросы