Форум программистов «Весельчак У»
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
Начало
Наши сайты
Галерея
Весельчак У
Наша Вики
Хранилище
Проекты
Правила
Правила форума
Правила русского языка
Помощь
Поиск
Календарь
Почта
Войти
Регистрация
Форум программистов «Весельчак У»
>
Программирование
>
Perl
(Модератор:
McZim
) > Тема:
Управление циклом
Страниц: [
1
]
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: Управление циклом (Прочитано 4228 раз)
0 Пользователей и 1 Гость смотрят эту тему.
perl6
Помогающий
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
Технический
Администратор
Offline
Пол:
Re: Управление циклом
«
Ответ #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
Помогающий
Offline
Re: Управление циклом
«
Ответ #2 :
12-06-2018 12:46 »
Цитата: RXL
Но цикл зависнет на 5. Надо предусмотреть выход. Для этого добавил $no_redo.
Выглядит кривовато, как и описание задачи.
Ага, сам вчера сидел и ковырял примеры, тоже также, цикл зависал, а я ломал голову, все никак не мог понять, в чем тут дело.
Сейчас объясню, зачем мне такой огород, парсю страницы, иногда вылазиет ошибка, а парсинг идет в цикле по числу страниц, вот и хочу добавить условие, при котором страница будет несколько раз запрашиваться, если вдруг ошибка вылезет.
Спасибо за пример.
Записан
RXL
Технический
Администратор
Offline
Пол:
Re: Управление циклом
«
Ответ #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
Технический
Администратор
Offline
Пол:
Re: Управление циклом
«
Ответ #4 :
12-06-2018 14:29 »
По задаче.
Вынеси обработку в подпрограмму. Вызывай функцию в каждой итерации нужное количество раз.
Код: (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
Команда клуба
Offline
Пол:
Re: Управление циклом
«
Ответ #5 :
12-06-2018 19:53 »
а зачем цикл с итерацией?
do while
или while do
не знаю как в перле
Записан
Мы все учились понемногу... Чему-нибудь и как-нибудь.
RXL
Технический
Администратор
Offline
Пол:
Re: Управление циклом
«
Ответ #6 :
12-06-2018 21:50 »
Смотря что нужно: бесконечные попытки или конечное количество. Обычно достаточно 2-х попыток чтобы понять, что ответа не будет.
Когда могут понадобиться бесконечные попытки? Прежде всего, когда нет лимита времени ожидания. И еще когда мы знаем, что сервис непременно ответит. Путь не сейчас, но ответит. Этот алгоритм применим разве что в локальной сети пр обращению к определенному, хорошо знакомому узлу.
В обычной практике необходимость второй попытки говорит, что с сервисом что-то не так. Может канал связи перегружен, может сервис перегружен. В любом случае, повторные попытки только усугубят проблему.
Но есть ситуация, когда второй запрос имеет смысл: когда сервис распределенный, первый запрос попал на обработку в неисправный узел (хост, кластер, балансер, маршрутизатор и т.п.) и есть вероятность, что второй запрос попадет в другой узел. Три попытки — это этот же случай, но мы используем еще один шанс, зачастую лишний.
Кстати, второй запрос порой помогает, когда время на ответ лимитировано (можно подождать только Х времени, а типичным временем ответа является Y < X/2). В таком случае можно в момент X/2 послать второй запрос, ожидая, что один из двух придет раньше наступления X. Этот подход тоже базируется на использовании распределенных сервисов.
«
Последнее редактирование: 12-06-2018 21:56 от RXL
»
Записан
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Страниц: [
1
]
Вверх
Печать
« предыдущая тема
следующая тема »
Форум программистов «Весельчак У»
>
Программирование
>
Perl
(Модератор:
McZim
) > Тема:
Управление циклом
Загружается...