読者です 読者をやめる 読者になる 読者になる

my と local の話より do{}->() が分からなかった

perl

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)が一番分かり易かったかな。