Использование конструкции while (1) {......} чаще всего - PullRequest
2 голосов
/ 05 марта 2012

Это мой код ..

while (1) {
    do_stuff;
    do_some_checks;
    do {  warn error 1; last }  if not OK;

    do_more_stuff;
    do_some_checks;
    do {  warn error 2; last }  if not OK;

    do_even_more_stuff;
    do_some_checks;
    do {  warn error 3; last }  if not OK;

    ...
    #finally
    last;
}

Я предпочитаю его приведенному ниже:

do_stuff;
do_some_checks;
if (!OK) {
    warn error 1;
} else {
    do_more_stuff;
    do_some_checks;
    if (!OK) {
        warn error 2;
    } else {
       do_even_more_stuff;
       do_some_checks;
       if (!OK) {
           ...
       }
       # finally
       success!    
    }
}

Единственное, что меня поражает каждый раз, когда я использую эту конструкцию иногдаЯ забыл добавить окончательный last, что привело к бесконечному циклу.Но этот шаблон серии проверок и залога происходит так часто в моем коде, что конструкция быстро стала второй натурой.

Любой, кто приобрел такую ​​же привычку, или, возможно, будет использовать какую-то альтернативу.

Заранее спасибо.

Ответы [ 3 ]

7 голосов
/ 05 марта 2012

Ух ты, ты там совсем не так. В то время как для цикла, вы не цикл. Я вижу, что вы хотите, но почему бы просто не использовать саб?

##
# This sub does three things:
# thing1,
# thing2, 
# thing3
sub do_three_things {   
 do_stuff;   
 do_some_checks;  
 do {  warn error 1; return }  if not OK;  

 do_more_stuff;  
 do_some_checks;   
 do {  warn error 2; return }  if not OK;  

 do_even_more_stuff;  
 do_some_checks;
 do {  warn error 3; return }  if not OK; 

   ...
#finally   
 return; #if you forget this return, the sub will end anyway.
}

do_three_things(); # Call the sub

Преимущества сабвуфера:

  • Хорошее кодовое разделение
  • Меньший объем

Редактировать: как отмечает Хачи, вам даже не нужен сабвуфер, просто блок тоже работает для last. Тем не менее, я сам предпочитаю подпрограмму, чтобы вы могли более четко отделить вещи, что облегчает тестирование и / или повторное использование кода.

4 голосов
/ 05 марта 2012

Сотрите while(1).

. В Perl вы можете просто "последний" из обычного блока {} без цикла.

У меня была та же привычка, пока я не узнал, какгибкий perl есть;)

0 голосов
/ 05 марта 2012

Если вы хотите перейти к, просто используйте goto, не маскируйте его как конструкцию петли.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...