myとourがよくわからん

パッケージのトップレベルで宣言されてる変数のmyとourの扱いがよくわからん。

  • ourで宣言された変数は永続的に存在している
  • myで宣言されて変数はあるスコープ内でのみ存在している

と思っていたのだけど、どうやらmyの扱いはこのかぎりではないみたい?

ためしに下のようにコードを書いてみた。

use strict;
use warnings;
use YAML qw(Dump);

# 名前をセット
print "# Setting names... \n";
WinterGarden::set_my_name('nyu'); # myで宣言された変数にセット
$WinterGarden::our_name = 'nyo';  # ourで宣言された変数にセット

# 名前の表示
print "# Names are...\n";
WinterGarden::say_names(); # myで宣言された変数の中身も表示される

# パッケージの名前空間を覗く
print "# Dumping namespace of WinterGarden\n";
print Dump(\%{WinterGarden::});


package WinterGarden;

my $my_name;
our $our_name;

sub set_my_name { $my_name = shift; }

sub say_names {
    print "my_name = $my_name\n";
    print "our_name = $our_name\n";
}

実行結果:

$ perl my_or_our.pl
# Setting names... 
# Names are...
my_name = nyu
our_name = nyo
# Dumping namespace of WinterGarden
---
our_name: !!perl/glob:
  PACKAGE: WinterGarden
  NAME: our_name
  SCALAR: nyo
say_names: !!perl/glob:
  PACKAGE: WinterGarden
  NAME: say_names
  CODE: !!perl/code: '{ "DUMMY" }'
set_my_name: !!perl/glob:
  PACKAGE: WinterGarden
  NAME: set_my_name
  CODE: !!perl/code: '{ "DUMMY" }'

set_my_name()で設定した名前がちゃんと保存されて、say_names()で表示できている。ということは、my $my_nameはどこかに保存されているはずなんだけど、WinterGardenパッケージにはどうやら含まれてないみたい。

my $my_nameはどこいったんだ?