ourは、パッケージ変数の宣言時に使う。
our - パッケージ変数の宣言 - Perlプログラミング入門ゼミ - Perlでテキスト処理・Linuxサーバー管理・Webシステム開発
myで宣言したレキシカル変数は、スコープを抜けると参照できないが、ourで宣言したパッケージ変数は、スコープを抜けても、パッケージ名(完全修飾名)で参照できる。
宣言無し、my、local、でどうなるか検証してみた。
実行すると、
[bg1@dti-vps-srv93 our]$ vi our.pl [bg1@dti-vps-srv93 our]$ perl our.pl $unknown_var1 = 1 $my_var1 = 2 $our_var1 = 3 $unknown_var1 = $my_var1 = 2 $our_var1 = 3 $unknown_var2 = 10 $my_var2 = 20 $our_var2 = 30 $unknown_var1 = $my_var1 = 2 $our_var1 = 3 $unknown_var2 = 10 $my_var2 = $PackageA::our_var2 = 30 $our_var2 = 30 $main::our_var2 = $unknown_var2 = $PackageA::unknown_var2 = 10 $my_var2 = $PackageA::my_var2 = $our_var2 = $PackageA::our_var2 = 30 [bg1@dti-vps-srv93 our]$
結構ややこしい。
まず、これの値がNULLになる。宣言無しはパッケージブロックに入ると別変数扱いになるようだ。
スコープを抜けても、PackageAの変数で扱われる。(myとourはmainの変数で扱われる。)
ourは完全修飾名で外からもアクセス可能。
しかし、
付けなくてもアクセスできちゃう・・・。
おそらくmainに$our_var2がないので、PackageAのものがあるからそれと認識してるのでは。
mainにはないのを確認。(NULLになったので。)
PackageBからは、$PackageA::unknown_var2と、$PackageA::our_var2が参照でき、それ以外はアクセスできなかった。
ourはどこでも読めるので、完全修飾名であれば読めるのはわかる。
$PackageA::unknown_var2は、our付けてなくてもパッケージ変数として認識されてるのかな。
とにかくややこしい。
そりゃ、my以外使う必要ないって言われるわ・・・。
Sample/perl/our/our/src/our at master · bg1bgst333/Sample · GitHub