#perl #for-loop #while-loop #continue
#perl #для цикла #во время цикла #продолжить
Вопрос:
Я только начал изучать язык сценариев Perl и у меня есть вопрос.
Какова логическая причина того, что в Perl continue
блок работает с циклами while
и do while
, но не с for
циклом?
Комментарии:
1. 13 лет в Perl, и я никогда не программировал блок продолжения. Главным образом потому, что одни и те же инструкции могут быть помещены в конец цикла. По сути, это похоже на
next
-with-behavior. Однако, я толькоnext
когда я больше ничего не хочу делать с итерацией. И это намного проще кодироватьfor( ; cond() ; iteration())...
и получать то же поведение.2. Я согласен, лесоруб. For, безусловно, более предпочтителен и имеет такое же поведение. Спасибо.
3.
continue
все еще выполняется при использованииnext
. Я использую это, когда мне нужно выйти из внутреннего цикла во внешний цикл, но все еще хочу убедиться, что какое-то условие выполняется. Да, я мог бы сделать это, поместив то, что я хочу выполнить, после внутреннего цикла и используяnext
, но тогда все остальное там тоже будет выполнено. И это просто еще одна вещь, загромождающая поток программы. Сcontinue
я могу просто знать, что это будет выполнено, и могу пропустить некоторые вещи, если захочу.
Ответ №1:
Из http://perldoc.perl.org/functions/continue.html
Если к БЛОКУ присоединен БЛОК продолжения (обычно в while или foreach ), он всегда выполняется непосредственно перед повторным вычислением условия, точно так же, как третья часть цикла for в C.
Это означает, что в for
цикле третьим аргументом ЯВЛЯЕТСЯ выражение continue, например for (initialization; condition; continue)
, поэтому оно не требуется. С другой стороны, если вы используете for
в foreach
стиле, например:
for (0 .. 10) {
print "$in";
} continue { $i }
Это будет приемлемо.
Комментарии:
1. Потрясающе, @TLP! Я полностью понимаю. Спасибо!
2. Этот синтаксис правильный, но в данном контексте синтаксис for интерпретируется как оператор foreach . было бы лучше, если бы вы использовали for как for, а foreach как foreach . вам помешает множество ошибок.
3. @Znik Невозможно допустить ошибок, поскольку
for
иforeach
фактически являются псевдонимами одной и той же функции.4. Разве мы не можем просто сделать: for (0 .. 10) { print «$ i n»; $ i } Я что-то здесь упускаю?
Ответ №2:
Я подозреваю, что continue
блок не используется в for
циклах, поскольку он в точности эквивалентен 3-му выражению for
цикла (приращение / уменьшение и т.д.)
например. следующие блоки кода в основном эквивалентны:
for ($i = 0; $i < 10; $i )
{
}
$i = 0;
while ($i < 10)
{
}
continue
{
$i ;
}
Комментарии:
1. Разве мы не можем просто сделать: $ i = 0; while ($i < 10) { $ i ; } Я что-то здесь упускаю?
Ответ №3:
Вы можете использовать continue
блок везде, где это имеет смысл: с while
, until
и foreach
циклами, а также «базовыми» блоками — блоками, которые не являются частью другого оператора. Обратите внимание, что вы можете использовать ключевое слово for
вместо foreach
для конструкции итерации списка, и, конечно, в этом случае у вас может быть continue
блок.
Как все говорили, у for (;;)
циклов уже есть continue
часть — какую из них вы хотели бы выполнить в первую очередь?
continue
с блоками также не работает, do { ... } while ...
потому что синтаксически это совсем другое ( do
это встроенная функция, принимающая БЛОК в качестве аргумента, а while
часть является модификатором оператора). Я полагаю, вы могли бы использовать с ними конструкцию double curly (базовый блок внутри блока аргументов), если бы вам действительно нужно было:
do {
{
...;
continue if $bad;
...;
}
continue {
...; # clean up
}
} while $more;