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 になるんだろうと予想してみよう。