そういえば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!!

推測するならば、文字列もブロックも渡せるのは
「値」部分ではなく「関数」部分に変数を使えるようにするため?とか思ってみた。

OOP以前のポリモルフィズムなんだろうか。

それはそれとして

ブロックを与えるタイプの構文を見てみると、
「eval内は別スコープ」って意味が分かると思う。

普通に

$a = 1;
{
  my $a = 2;
  print $a; # 2
}
print $a; # 1

と同じこと。