Как мне выйти из цикла в Perl?

239

Я пытаюсь использовать оператор break в цикле for, но поскольку я также использую строгие подмножества в своем коде Perl, я получаю сообщение об ошибке:

Запрет "разбить" "строгие субтитры" в использовании на. /final.pl строка 154.

Есть ли обходной путь для этого (помимо отключения строгих подсистем)?

Мой код отформатирован следующим образом:

for my $entry (@array){
    if ($string eq "text"){
         break;
    }
}
  • 20
    И если бы у вас не было «строгих подпрограмм», вы бы получили ошибку во время выполнения, когда не смогли найти подпрограмму «перерыв».
Теги:
loops
strict
break

4 ответа

367
Лучший ответ

О, я нашел его. Вы используете last вместо break

for my $entry (@array){
    if ($string eq "text"){
         last;
    }
}
  • 0
    Хотя это всего лишь семантическое различие и не намного больше, чем текстовая согласованность с командой «next».
  • 0
    не говоря уже о том, что «break» является экспериментальным ключевым словом в> 5.010, верно? так что вы можете получить недопустимую внешнюю ошибку блока, а не использовать ее. Единственный способ, который даже сработает, - это если вы используете цикл while внутри заданного блока, а затем прервитесь, что в теории будет работать так, как вы хотели, если IF (и только если) в данном блоке есть только цикл while, и Предполагая, что вы просто кормили, учитывая некоторую скалярную переменную ... но почему все это работает только для того, чтобы использовать разрыв, это (очень) плохая форма, не говоря уже о (бла!) просто сказать, что это "возможно", просто не хорошо идея, а не то, что вы думаете, это
Показать ещё 2 комментария
168

Дополнительные данные (если у вас есть дополнительные вопросы):

FOO: {
       for my $i ( @listone ){
          for my $j ( @listtwo ){
                 if ( cond( $i,$j ) ){

                    last FOO;  # --->
                                   # |
                 }                 # |
          }                        # |
       }                           # |
 } # <-------------------------------
  • 2
    На самом деле вам не нужны скобки после FOO:
  • 12
    Вы делаете, если у вас есть другой код сразу после цикла для $ i, который вы также хотите пропустить. Внешний {} - это пустой блок, который сам по себе является забавным видом цикла, который может быть последним / redo / next'd.
9

Просто last будет работать здесь:

for my $entry (@array){
    if ($string eq "text"){
         last;
    }
}

Если у вас есть вложенные циклы, то last выйдет из самого внутреннего. В этом случае используйте метки:

LBL_SCORE: {
       for my $entry1 ( @array1 ){
          for my $entry2 ( @array2 ){
                 if ( $entry1 eq $entry2 ){   # or any condition
                    last LBL_SCORE;
                 }
          }
       }
 }

Указанный оператор last заставит компилятор выйти из обоих циклов. То же самое можно сделать в любом количестве циклов, а метки можно фиксировать где угодно.

3

На большой итерации мне нравится использовать прерывания. Просто нажмите Ctrl + C, чтобы выйти:

my $exitflag = 0;
$SIG{INT} = sub { $exitflag=1 };

while(!$exitflag) {
    # Do your stuff
}
  • 0
    Это круто, у меня не было главы $ SIG {INT} раньше
  • 0
    Действительно очень полезное предложение. +1

Ещё вопросы

Сообщество Overcoder
Наверх
Меню