Как правило, рекомендуется избегать GOTO. Помня об этом, я обсуждал эту тему с коллегой.
Рассмотрим следующий код:
Line:
while( <> ) {
next Line if (insert logic);
}
Использует ли метку цикла как goto?
Вот что perlsyn в perldoc должно сказать:
Здесь, как программист C может кодировать определенный алгоритм в Perl:
for (my $i = 0; $i < @ary1; $i++) {
for (my $j = 0; $j < @ary2; $j++) {
if ($ary1[$i] > $ary2[$j]) {
last; # can't go to outer :-(
}
$ary1[$i] += $ary2[$j];
}
# this is where that last takes me
}
В то время как здесь, как программист Perl, более удобный с идиомой, может это сделать:
OUTER: for my $wid (@ary1) {
INNER: for my $jet (@ary2) {
next OUTER if $wid > $jet;
$wid += $jet;
}
}
Я считаю, что это не так, потому что вы явно говорите о замкнутом цикле и продвигаетесь вперед, но мой коллега не согласен, говорит, что это просто причудливый GOTO, и его следует избегать. Я ищу либо убедительный аргумент, либо документацию, объясняющую, почему это или не является GOTO. Я также согласен с объяснением, почему это или не считается хорошей практикой в perl.