our

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