無精で短気で傲慢なプログラマ

UNIX や web やプログラムの技術的なことを中心に。

Perl の「裸のブロック」と next

今日 Perl で はまったこと。
foreach (1..5){
   {
     if ( $_ == 3 ){ next; }
   }
   print "$_\\n";
}

の結果は、1,2,4,5, ではなく 1,2,3,4,5 となる。

ラクダ本曰く
 「ブロックは、意味的には、1回だけ実行されるループと等価」
とのこと。知らなかった。

わたしは変数のスコープを狭くするために
{
   my $tmpbuf = &func($hoge);
   $tmpbuf =~ s/,//g;
   if ( $tmpbuf eq '' ){
     $flag = 1;
   }
}

などと裸のブロック (bare block) を多用するので、この仕様は嫌だなぁ。

ちなみに似たようなはまりやすい点として、perl では do { ... } while; 内での next・last・redo は効かない、というのがある。

ついでに言うと、C においては continue・break は裸のブロックに対して作用しない。
main(){
   int i;
   for (i=1 ; i<=5 ; i++ ){
     {
       if ( i==3 ){ continue; }
     }
     printf("%d\\n", i);
   }
}

の結果は 1,2,4,5 となる。
スポンサーサイト

PageTop

コメント


管理者にだけ表示を許可する
 

スコープを曖昧にしてるのが原因でしょう?

スコープを曖昧にしてるのが原因でしょう?
ブロックで影響範囲示してるんだから、どのレベルまで飛びたいかを明示しないとね
main:
for my $i (1..3){
{
if($i == 3){
next main
}
}
print $i
}

| URL | 2011-02-17(Thu)01:08 [編集]