
今日 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 となる。
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 となる。
スポンサーサイト


