my と local の話より do{}->() が分からなかった
my と local のサンプル - IT戦記を見ていろいろ試してみたけど、どうしても「do{}->()」の部分の挙動が分からなくてモヤモヤしていた。
そしたら、最高に分かり易いエントリを見つけたので、以下にメモしておく。ホントに感謝。
[Perl] my と local と our の違いについて - TAKESAKOのはてな出張所
id:amachang のコードの(2)は、クロージャになってたから $foo が見えたんだな。my と local の問題というより、自分が do{}->() の挙動を理解していなかったのがいけなかったんだ。以下ほぼ引用。
our $foo = 0; do { local $foo = 1; sub { print "$foo\n" } # 0 }->();
は
our $foo = 0; my $func = do { local $foo = 1; sub { print "$foo\n" } }; $func->(); # 0
と等価。local を my に変えればクロージャになるので 1 が表示される。
our $foo = 0; my $func = do { my $foo = 1; sub { print "$foo\n" } }; $func->(); # 1
だけど、今のところ、純粋に local と my の違いについて知りたいんだったら、Effective Perl (ASCII Addison Wesley Programming Series)の 23項(p.99)が一番分かり易かったかな。