2008-11-19 218 views
244

我想在for循環使用break聲明,但因爲我也在我的Perl代碼使用嚴格的潛艇,我得到一個錯誤說:如何擺脫Perl中的循環?

裸詞「破發」不準而 「嚴格潛艇」在使用中./final.pl 線154

有沒有一種解決方法(除了禁用嚴格的潛艇)?

我的代碼的格式如下:

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

如果你沒有「嚴格的潛艇」,你會得到一個運行時錯誤,而不是找到一個名爲「break」的子。 – 2008-11-19 20:43:16

回答

357

哦,我發現它。您使用的last代替break

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

雖然這僅僅是一種語義上的差異,除了與「下一個」命令的文本一致性之外,它並不等於其他很多。 – 2010-07-08 20:14:58

+0

更不用說,'break'是一個實驗性的關鍵詞,在> 5.010的權利?所以你可能會得到一個非法的外部給定的塊錯誤,而不是你應該使用它。唯一可行的方法是,如果你在給定塊內使用了一個while循環,然後中斷,這在理論上會按照你想要的方式工作(並且只有)給定的塊只有while循環,並且假設你只是給了一些標量變量......但爲什麼所有這些工作只是爲了休息一下,它是(非常)糟糕的形式,更不用說了(blah!)只是說,它的「可能」不是一個好東西想法並不是你可能認爲這是 – osirisgothra 2014-09-01 15:50:29

+11

由於某種原因,我完全無法記住這個關鍵字'最後'。總是以Google搜索'perl break loop'結尾:( – Thupten 2015-09-08 04:50:02

161

附加數據(如果您有更多的問題):

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

        last FOO; # ---> 
            # | 
       }     # | 
      }      # | 
     }       # | 
} # <------------------------------- 
3

在我喜歡使用中斷大迭代。只需按下Ctrl鍵+Ç退出:

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

while(!$exitflag) { 
    # Do your stuff 
} 
11

只需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聲明將使編譯器從兩個環路出來。在任何數量的循環中都可以做到這一點,並且標籤可以在任何地方固定。