Вопрос

Согласно руководству Perl для last (http://perldoc.perl.org/functions/last.html.), last нельзя использовать, чтобы вырваться из do {} петли, но это не упоминает альтернативу. Сценарий, который я поддерживаю, имеет эту структуру:

do {
    ...
    if (...) 
    {
        ...
        last;
    }
} while (...);

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

Это было полезно?

Решение

do BLOCK while (EXPR) смешно в том, что это не на самом деле структура петли. Итак, последний, следующий, и Redo не должен использоваться там. Избавьтесь от последней и настройте EXPR, чтобы оценить false, когда эта ситуация найдена. Кроме того, включите строгое, что должно дать вам хотя бы предупреждение здесь.

Другие советы

Оберните «петлю» в голый блок (который является цикл):

{
    do {
        ...
        if (...) 
        {
            ...
            last;
        }
    } while (...);
}

Это работает для последнего и повтора, но не дальше; Для этого разместить голый блок внутри блока DO:

do {{
    ...
    if (...) 
    {
        ...
        next;
    }
    ...
}} while (...);

Никогда не вентилятор делаю / пока петли в Perl. то do не на самом деле не является цикл, почему last не выйдет из этого. В нашем старике Pascal Не удалось выйти из цикла в середине, потому что это было бы неправильно По словам Sage Niklaus «один вход / один выход» вирт. Поэтому нам пришлось создать флаг выхода. В Perl это выглядит что-то подобное:

my $endFlag = 0;
do {
    ...
    if (...) 
    {
        ...
        $endFlag = 1;
    }
} while ((...) and (not $endFlag));

Теперь вы можете увидеть, пока Паскаль никогда не оказался.

Почему бы не просто использовать цикл While While?

while (...) {
  ...
  if (...) {
    last;
  }
}

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

Кстати, вы на самом деле можете вырваться из петли Pascal, если вы используете Delphi, и Delphi накосят немного, пока Microsoft не осмотрелась и не вышла с языками .NET.

@ "http://perldoc.perl.org/functions/last.html":Последнее нельзя использовать для выхода из блока, который возвращает такое значение, как eval {}, sub {} или do {}, и не должен использоваться для выхода из операции GREP () или MAP ().

Итак, используйте логию в «пока ()» и установите его, где у вас есть «последний» ...

Поздно на вечеринку - я возился с for(;;) недавно. В моем рудиментарном тестировании для условных выражений A и B, что вы хотите сделать с:

do {
    last if A;
} while(B);

может быть достигнуто как:

for(;; B || last) {
    last if A;
}

Немного уродливой, но, возможно, не более, чем другие обходные пути :). Пример:

my $i=1; 
for(;; $i<=3 || last) { 
    print "$i ";
    ++$i;
}

Выходы 1 2 3. Отказ И вы можете объединить приращение, если хотите:

my $i=1;
for(;; ++$i, $i<=3 || last) { 
    print "$i ";
}

(с использованием || потому что он имеет более высокий приоритет, чем ,)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top