Моя первоначальная мысль о прочтении вопроса была прямо противоположна тому, что предполагали предыдущие ответы: Вам не важно , какое условие вызвало преждевременный выход из цикла, только независимо от того, вышел ли цикл рано или нет,Учитывая, что вы используете цикл 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
}