Альтернатива для «последних» в петлях
-
09-10-2019 - |
Вопрос
Согласно руководству 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 ";
}
(с использованием ||
потому что он имеет более высокий приоритет, чем ,
)