パッケージのトップレベルで宣言されてる変数の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はどこいったんだ?