Practice of Programming

プログラム とか Linuxとかの話題

後置ループにもスコープがある?

%SIGに同じ関数登録しようとして、

local $SIG{$_} = sub {...} for qw/INT TERM ALRM .../;

みたいなことをしたんだが。うまくいかなかった。
どうも、後置forの前は見えないスコープがあるようだ。localが効いてない。


ちなみに、if はそんなことはない。

my $hoge = 1 if 1;
print $hoge;

もちろん、こんな使い方はありえないけど。


ラクダ本 4.5 裸のブロック(p.143) に、「裸のブロックは一回だけ実行されるループなので、ループ制御ができる。ifやunlessはループではないので使えない」みたいな旨が書かれている。これは、

{
   # ...
   last if ...;
   # ...
   last if ...;
}

みたいなことができますよな話なんですが。if/unlessとループのブロックは、ループ制御ができるという点で、同じブロックでも違うということだ。

後置forもループ制御ができるように、見えないブロックがあるんだな、きっと。と思って、後置forで、lastを使ってみる。

print and $_ == 3 and last for 1..5

ちゃんとlastが効く。知らんかった。後置ループで制御とか、やること無いと思うけど。


これは、どうかなー?

my $hoge = 1 for 1;
my $hoge = 1 for 1;

あらら、警告出ちゃいました。

"my" variable $hoge masks earlier declaration in same scope

まぁ、こんなことすることはないけど。一応、バグになるんだろうか?


しかし...だから、何だよって感じの内容だw


複数指定する際のlocalのうまい使い方はfbisさんが紹介してくれてます。
http://d.hatena.ne.jp/fbis/20090203/1233655150


ちなみに、僕もいつもこのやり方でやってるんですが、たまには変なことしてみたい衝動に駆られてやってみたら変なことになったので書いてみたわけでした(ぉ