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と読み替えてくれてるってことだね。