ourをもう少し詳しく試してみる
ourで宣言した変数はレキシカルスコープで、パッケージに属する。
完全修飾名でなくてもアクセス可。
コメントを受けて訂正。
ourで宣言した変数はパッケージに属し、グローバル変数となる。
パッケージ外からも参照でき、block scopeの影響を受けない。
参照は[パッケージ名]::[変数名]で。
package Hoge; our $var = "var"; { our $var2 = "var2"; } package Foo; warn "$Hoge::var\n"; #パッケージに属する warn "$Hoge::var2\n"; #Block Scopeがあっても参照できる warn "$var\n"; #完全修飾名じゃなければ、Perlが補う? warn "$var2\n"; #これはundef
実行すると、
Use of uninitialized value in concatenation (.) or string at our.pl line 11.
なので、$var2を$Foo::var2と読み替えてくれてるってことだね。