Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Управление циклом  (Прочитано 9469 раз)
0 Пользователей и 1 Гость смотрят эту тему.
perl6
Помогающий

ru
Offline Offline

« : 11-06-2018 20:51 » 

Приветствую. Что то не соображу никак, как реализовать программу. Имеется цикл от 1 до 10, например, при условии $i = 5, цикл должен повториться с 5. Т.е., от 1 до 5 итерации прошли, на 5-й мы проверили условие, и с 5-й продолжили цикл, не пропуская ее, те. вывод $i должен быть вида
1 2 3 4 5 5 6 7 8 9 10
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 11-06-2018 22:10 » 

Код: (Perl)
my $no_redo;

for my $i (...) {
  ...
  $no_redo = 1, redo if !$no_redo && $i == 5;
  ...
}

Но цикл зависнет на 5. Надо предусмотреть выход. Для этого добавил $no_redo.
Выглядит кривовато, как и описание задачи.
« Последнее редактирование: 11-06-2018 22:13 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
perl6
Помогающий

ru
Offline Offline

« Ответ #2 : 12-06-2018 12:46 » 

Цитата: RXL
Но цикл зависнет на 5. Надо предусмотреть выход. Для этого добавил $no_redo.
Выглядит кривовато, как и описание задачи.

Ага, сам вчера сидел и ковырял примеры, тоже также, цикл зависал, а я ломал голову, все никак не мог понять, в чем тут дело.
Сейчас объясню, зачем мне такой огород, парсю страницы, иногда вылазиет ошибка, а парсинг идет в цикле по числу страниц, вот и хочу добавить условие, при котором страница будет несколько раз запрашиваться, если вдруг ошибка вылезет.
Спасибо за пример.
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #3 : 12-06-2018 14:20 » 

Чтобы не ломать голову, придумали отладку. У перла встроенный отладчик.
perl -d some_prog.pl
Отладка начнется с самого начала программы.
Если нужно начать с произвольного места, поставь в нужное место программную точку останова:
Код: (Perl)
$DB::single = 1;
или даже
Код: (Perl)
$DB::single = 1 if $i == 5;
Запускать также, отладка начнется также, с самого начала, но после можно выполнить команду отладчика "c" и следующий останов будет по ошибке или в любой точке останова.
Рекомендую почитать perldoc perldebug

И учти, что под отладкой перл работает на порядок медленнее.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #4 : 12-06-2018 14:29 » new

По задаче.
Вынеси обработку в подпрограмму. Вызывай функцию в каждой итерации нужное количество раз.
Код: (Perl)
for my $i (1 .. 10) {
  for my $try (1 .. 3) {
    if (process()) {
      say "тут все хорошо";
      last;
    }

    say "тут все плохо";

    if ($i == 3) {
      say "тут хуже некуда";
    }
  }
}
Здесь подразумевается, что process вернет ложь при сбое ("", 0, undef или пустой список).
Количество повторов кошернее вынести в константу.
Код: (Perl)
sub MAX_RETRIES() { 3 } # самый простой способ

use constant MAX_RETRIES => 3; # более кошерный способ
use constant {
    MAX_RETRIES => 3, # способ объявить в одном use constant несколько констант сразу
};
Следующий уровень кошерности — вынос в конфиг.
« Последнее редактирование: 12-06-2018 19:45 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #5 : 12-06-2018 19:53 » 

а зачем цикл с итерацией?

do while

или while do

не знаю как в перле
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #6 : 12-06-2018 21:50 » 

Смотря что нужно: бесконечные попытки или конечное количество. Обычно достаточно 2-х попыток чтобы понять, что ответа не будет.
Когда могут понадобиться бесконечные попытки? Прежде всего, когда нет лимита времени ожидания. И еще когда мы знаем, что сервис непременно ответит. Путь не сейчас, но ответит. Этот алгоритм применим разве что в локальной сети пр обращению к определенному, хорошо знакомому узлу.
В обычной практике необходимость второй попытки говорит, что с сервисом что-то не так. Может канал связи перегружен, может сервис перегружен. В любом случае, повторные попытки только усугубят проблему.
Но есть ситуация, когда второй запрос имеет смысл: когда сервис распределенный, первый запрос попал на обработку в неисправный узел (хост, кластер, балансер, маршрутизатор и т.п.) и есть вероятность, что второй запрос попадет в другой узел. Три попытки — это этот же случай, но мы используем еще один шанс, зачастую лишний.
Кстати, второй запрос порой помогает, когда время на ответ лимитировано (можно подождать только Х времени, а типичным временем ответа является Y < X/2). В таком случае можно в момент X/2 послать второй запрос, ожидая, что один из двух придет раньше наступления X. Этот подход тоже базируется на использовании распределенных сервисов.
« Последнее редактирование: 12-06-2018 21:56 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines