Программирование на Perl: продолжить блок

#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;