perl の my, local, our の話
local と my - IT戦記 とか 404 Blog Not Found:perl - myとourとscopeと とか my と local のサンプル - IT戦記 のあたりからの話です。
$\ = "\n"; sub test() { print "1: $var"; } $var = 'main'; { package MY; { my $var = "my"; # my は、このスコープ内でのみ有効 test02(); } sub test02() { print "0: $var"; } # 0: &main::test(); # 1: main (sub { print "2: $var"; })->(); # 2: print "3: $var"; # 3: } { package OUR; { our $var = "our"; # our は、このパッケージ内で有効 test02(); } sub test02() { print "0: $var"; } # 0: our &main::test(); # 1: main (sub { print "2: $var"; })->(); # 2: our print "3: $var"; # 3: our } { package LOCAL; { local $var = "local"; # local は、このスコープから呼び出される範囲で有効 test02(); } sub test02() { print "0: $var"; } # 0: local &main::test(); # 1: main (sub { print "2: $var"; })->(); # 2: print "3: $var"; # 3: }
つまり Java に例えると、
- 「 my var = 1; 」 はごく普通のローカル変数
- 「 our var = 1; 」 は 「 this.var = 1; 」(ただし this は Singleton)
- 「 local var = 1; 」は……難しいな……。LOCAL::test02 呼び出しの際に現在のコンテキストを渡してるのは確実だから、そっちを見ている感じがするなぁ。
なのかなぁ。自信なし。ってかさっき初めて perl 入れたし……。
ん?
no strict 'refs'; package main; (sub { my $var = 'my'; our $var = 'our'; print "$var\n"; # -> our })->(); (sub { my $var = 'my'; $main::var = 'our'; print "$var\n"; # -> my })->(); (sub { my $var = 'my'; ${__PACKAGE__.'::var'} = 'our'; print "$var\n"; # -> my })->();
our って、単純に ${__PACKAGE__.'::var'} へと置き換えられるってわけじゃなさそうだな。たぶん sub の中で our すると、our = sub になるんだろうと予想してみよう。