loops last - 我如何擺脫Perl中的循環?




while (5)

我試圖在for循環中使用break語句,但由於我在我的Perl代碼中也使用了嚴格的subs,所以我得到一個錯誤:

在./final.pl第154行使用“strict subs”時不允許使用Bareword“break”。

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

我的代碼格式如下:

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

Answers

哦,我找到了。 你使用last而不是break

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

在我喜歡使用中斷的大型迭代中。 只需按Ctrl + C即可退出:

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

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

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


其他數據(如果您有更多問題):

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

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

在ECMAScript 5下,您可以組合Object.keys()Array.prototype.forEach()

var obj = { first: "John", last: "Doe" };

Object.keys(obj).forEach(function(key) {
    console.log(key, obj[key]);
});

ECMAScript 6增加for...of

for (const key of Object.keys(obj)) {
    console.log(key, obj[key]);
}

ECMAScript 8添加了Object.entries() ,避免了查找原始對像中的每個值:

Object.entries(obj).forEach(
    ([key, value]) => console.log(key, value)
);

Object.keys()Object.entries()以與for...in循環相同的順序迭代屬性, 但忽略原型鏈 。 只迭代對象自己的可枚舉屬性。







perl loops break strict