そういえばeval。
前回「evalに与えた文字列は『ひとつのブロックの中』として扱われる」とか書いたわけだけど、
せっかくなのでevalについてもう少し。
evalの文法は以下の2種類。
eval EXPR eval BLOCK
まぁ要するに
eval 'package HOGE; print __PACKAGE__;';
って文字列を与える場合と
eval { package HOGE; print __PACKAGE__; };
ってブロックを与える場合があるってこと。
ちなみに、evalは関数じゃなくて構文なので、
$c = sub { print 5; }; eval $c;
とかやっても実行されない。
まぁ$SIG{__DIE__}いじってdoしてとかやれば自前のevalを実装することもできるけど、それはまた別の話。
なんでそうなってんの?
(゚∀゚)知らねえYO!!
推測するならば、文字列もブロックも渡せるのは
「値」部分ではなく「関数」部分に変数を使えるようにするため?とか思ってみた。
それはそれとして
ブロックを与えるタイプの構文を見てみると、
「eval内は別スコープ」って意味が分かると思う。
普通に
$a = 1; { my $a = 2; print $a; # 2 } print $a; # 1
と同じこと。