Программирование на Perl: продолжение блока - PullRequest
3 голосов
/ 11 мая 2011

Я только начал изучать язык сценариев Perl и у меня возник вопрос.

В Perl, какова логическая причина для работы блока continue с циклами while и do while, но не сfor петля?

Ответы [ 3 ]

7 голосов
/ 11 мая 2011

С http://perldoc.perl.org/functions/continue.html

Если к BLOCK присоединен блок продолжения BLOCK (как правило, через некоторое время или через foreach), он всегда выполняется непосредственно перед тем, как условное вычисление будет снова оценено, точно так же, как третья часть цикла for в C.

Это означает, что в цикле for третий аргумент является выражением продолжения, например, for (initialization; condition; continue), поэтомупоэтому это не нужно.С другой стороны, если вы используете for в стиле foreach, например:

for (0 .. 10) {
    print "$i\n";
} continue { $i++ }

Это будет приемлемо.

4 голосов
/ 11 мая 2011

Я подозреваю, что блок continue не используется в циклах for, поскольку он в точности соответствует 3-му выражению цикла for (увеличение / уменьшение и т. Д.)

например. следующие блоки кода в основном эквивалентны:

for ($i = 0; $i < 10; $i++)
{
}

$i = 0;
while ($i < 10)
{
}
continue
{
    $i++;
}
2 голосов
/ 11 мая 2011

Вы можете использовать блок continue везде, где это имеет смысл: с циклами while, until и foreach, а также с «базовыми» блоками - блоками, которые не являются частью другого оператора.Обратите внимание, что вы можете использовать ключевое слово for вместо foreach для конструкции итерации списка, и, конечно, в этом случае вы можете иметь блок continue.

Как и все остальные, for (;;)у циклов уже есть часть continue - какой из них вы хотите выполнить первым?

continue блоки также не работают с do { ... } while ..., потому что синтаксически это совсем другая вещь (doвстроенная функция, принимающая BLOCK в качестве аргумента, а часть while является модификатором оператора).Я полагаю, вы можете использовать двойную фигурную конструкцию с ними (базовый блок внутри блока аргумента), если вам действительно нужно:

do {
    {
        ...;
        continue if $bad;
        ...;
    }
    continue {
        ...; # clean up
    }
} while $more;
...