Forum Webscript.Ru

Программирование => Perl => Тема начата: HTML2K от 16 Марта 2002, 00:51:46

Название: Как выдти из цикла.
Отправлено: HTML2K от 16 Марта 2002, 00:51:46
Есть цикл for (....) {}
Нужно из него просто выдти. Чтонибуть типа end for; или exit for; Есть в перле чтонибуть похожее?
Название: Как выдти из цикла.
Отправлено: YA от 16 Марта 2002, 00:59:46
Цитировать
Есть в перле чтонибуть похожее?

Есть: last

METKA: for (...)
{
...
last METKA if ...;
...
}
Название: Как выдти из цикла.
Отправлено: HTML2K от 16 Марта 2002, 01:02:14
Но это тоже самое goto; а именно не переход куданибуть, а выход из цикла
Название: Как выдти из цикла.
Отправлено: YA от 16 Марта 2002, 01:44:16
goto в перле тоже есть, но его использование не приветствуется (да оно и не надо вовсе). А last можешь использовать и без метки.

См. также:
next - переход к следущей итерации;
redo - возврат к началу текущей итерации.
Название: Как выдти из цикла.
Отправлено: Green Kakadu от 16 Марта 2002, 02:35:11
Цитировать
можешь использовать и без метки.

например:

my $time=time();
while (1){
last if (time-$time)>15;
}
#через 15 сек. выйдет из цикла
Название: Как выдти из цикла.
Отправлено: HTML2K от 16 Марта 2002, 04:04:23
А

my $time=time();
while (1){
last if (time-$time)>0;
}

Сразу выдет из цикла ?
Название: Как выдти из цикла.
Отправлено: YA от 16 Марта 2002, 11:00:09
Цитировать
А

my $time=time();
while (1){
last if (time-$time)>0;
}

Сразу выдет из цикла ?

Нет не сразу, а именно через секунду (пройдет как минимум одна интерация).

А если написать ">=0", то выйдет обязательно из первой интерации.
Название: Как выдти из цикла.
Отправлено: Green Kakadu от 16 Марта 2002, 14:42:16
Цитировать
Нет не сразу, а именно через секунду (пройдет как минимум одна интерация).

не через секунду, а через одну итерацию ;) у меня за 5 сек, там несколько тысяч набежало.
Для видимости поставьте счетчик:

my $time=time();
while (1){
last if (time-$time)>0;
$i++;
}
print "Кол-во итераций: $i";
Название: Как выдти из цикла.
Отправлено: YA от 16 Марта 2002, 15:57:47
Green Kakadu
Разве я не правильно ответил на вопрос?
Цитировать
пройдет как минимум одна итерация

Т.е. столько, сколько успеет за первую секунду.
Название: Как выдти из цикла.
Отправлено: Green Kakadu от 16 Марта 2002, 17:40:15
Цитировать
Разве я не правильно ответил на вопрос?

угу, за секунду ;) я стормозил :)
Название: Как выдти из цикла.
Отправлено: HTML2K от 16 Марта 2002, 20:00:37
А если сделать так:

sub exitif {
my $time=time();
while (1){
last if (time-$time)>=0;
}
}

то вызов подпрограммы &exitif; будет выходом из любого if ???
Название: Как выдти из цикла.
Отправлено: YA от 16 Марта 2002, 21:19:13
Что значит
Цитировать
будет выходом из любого if
?
Цикл завершится на первой же итерации. Тут же завершится подпрограмма (если в ней больше ничего нет). И все! :)

Ты лучше напиши, что хочешь сделать.
А еще лучше переходи в форум "Perl".
Название: Как выдти из цикла.
Отправлено: HTML2K от 16 Марта 2002, 22:19:37
Вобщем надо сделать так, чтоб я мог в любом месте кода вставить оператор или вызов подпрограммы, чтобы выдти из любого условия.
Название: Как выдти из цикла.
Отправлено: YA от 16 Марта 2002, 23:46:26
Так, давай с начала. Что значит, "выдти из любого условия"? Пример привести можешь?
Название: Как выдти из цикла.
Отправлено: Green Kakadu от 17 Марта 2002, 00:51:34
Цитировать
Так, давай с начала. Что значит, "выдти из любого условия"? Пример привести можешь?

да, звучит весьма своеобразно: условие либо удовлетворяется либо нет, если удовлетворяется то зачем выходить? Если уж очень надо выйти, то YA написал вариант last с метками
Название: Как выдти из цикла.
Отправлено: HTML2K от 17 Марта 2002, 02:40:58
Блин я тупой, не из условия :)) а из цикла.

Есть серия циклов

for (...) {...}
for (...) {...}
for (...) {...}

В каждом цикле есть проверка на совпадение константы и счетчика цикла. Если условие выполняеться надо выдти из цикла, тоесть просто идти дальше по коду, как буд-то этого цикла не было. Вариант с меткой не подходит, циклов довольно много.
Название: Как выдти из цикла.
Отправлено: Green Kakadu от 17 Марта 2002, 03:12:49
Цитировать
Если условие выполняеться надо выдти из цикла, тоесть просто идти дальше по коду, как буд-то этого цикла не

for (...) {last if...}
for (...) {last if...}
for (...) {last if...}

А если нужно выйти из серии вложенных циклов то метка поможет (как YA говорил)

МЕТКА: for(..) {
                 for (...) {
                      for (...) { last METKA if.. }
                 }
}
Название: Как выдти из цикла.
Отправлено: HTML2K от 17 Марта 2002, 19:28:30
циклы не вложены
Название: Как выдти из цикла.
Отправлено: YA от 17 Марта 2002, 22:43:41
Цитировать
В каждом цикле есть проверка на совпадение константы и счетчика цикла. Если условие выполняеться надо выдти из цикла, тоесть просто идти дальше по коду, как буд-то этого цикла не было. Вариант с меткой не подходит, циклов довольно много.

Цитировать
циклы не вложены

Если циклы не вложены, то метки тебе не нужны. Если константа (переменная) определяется внутри циклов, то делай, как сказал Green Kakadu (проще не получится):
Цитировать
for (...) {last if...}
for (...) {last if...}
for (...) {last if...}

Если константа определяется до цикла(ов), то можно сделать проще... Опиши подробнее, на форуме очень мало телепатов :)
Название: Как выдти из цикла.
Отправлено: Green Kakadu от 18 Марта 2002, 17:06:24
Цитировать
Опиши подробнее, на форуме очень мало телепатов

вроде бы NeoNox практиковался в угадывании мыслей.