Как проверить, вышел ли код из цикла из-за последней команды? - PullRequest
3 голосов
/ 14 марта 2011

В цикле у меня есть несколько условий, и если условие не выполняется, я выхожу из цикла с использованием синтаксиса last.

while (condition) {
    if (possibility 1) {
        ...
        last;
    }

    if (possibility 2) {
        if (possibility 3) {
            ...
            last;
        }
        ...
        last;
    }
}

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

. Я ищу более простой / более элегантный способ сделать это.

Isкакая-нибудь переменная Perl, которая хранит информацию, которую мы вышли из цикла из-за последней?Или мне нужно самостоятельно поддерживать такую ​​переменную?

Ответы [ 3 ]

5 голосов
/ 14 марта 2011

Вам достаточно установить флаг перед выходом

0 голосов
/ 14 марта 2011

Моя первоначальная мысль о прочтении вопроса была прямо противоположна тому, что предполагали предыдущие ответы: Вам не важно , какое условие вызвало преждевременный выход из цикла, только независимо от того, вышел ли цикл рано или нет,Учитывая, что вы используете цикл while, это делается довольно легко и естественно, не требуя каких-либо дополнительных переменных-флагов, если только одна из ваших ветвей не изменит condition, чтобы сделать его ложным перед вызовом last:

while (condition) {
  # blah, blah, blah
}

if (condition) {
  # condition is still true, loop must have exited early due to "last"
} else {
  # loop exited because condition is no longer true
}

Если у вас есть ранние выходы, которые также сделали бы condition false, тогда вам нужно добавить флаг, чтобы отслеживать, прошла ли последняя итерация полностью или нет:

my $iter_finished;
while (condition) {
  $iter_finished = 0;
  if (foo) { last };
  if (bar) { condition = 1; last };
  if (baz) { condition = 0; last };
  $iter_finished = 1;
}

if ($iter_finished) {
  # We exited because condition became false
} else {
  # We exited early due to "last" and we know this regardless of condition's value
}
0 голосов
/ 14 марта 2011

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

while (condition) {
    if (possibility 1) {
        ...
        $satisfies_condition = 1;
    }

    if (possibility 2) {
        if (possibility 3) {
            ...
            $satisfies_condition = 3;
        }
        ...
        $satisfies_condition = 2;
    }

    last if $satisfies_condition;
}

На основе значения $satisifies_condition вы можете определить точку останова

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...