require内変数のスコープ

メインパッケージとは別スコープになって、myしたものはメインパッケージから参照できないらしい。ourで宣言するとグローバルスコープなので参照できるようになるとのこと。

変数のメインパッケージ内宣言とrequire内宣言の参照関係


our と my の解説。原文はperldocで参照。

([意]訳)
"our"は、宣言された現在のスコープの中で、現在のパッケージ変数を
簡単な名前で呼べるようにしてくれます。つまり、"our"で宣言されたレキシカルスコープ内では、パッケージ名で修飾することなく、その識別子名でパッケージ変数が呼び出せます。これは、パッケージスコープのuse varsと異なり、レキシカルスコープであるという所か要チェック。

"my"は、変数( $a )のためにメモリに領域を確保し、
変数( $a )がその領域を指し示すよう割り当てておくが、
"our"は、現在のパッケージのパッケージ変数( $Foo::a )を、
変数( $a )が指し示すように割り当てる。

つまり、 "our"はレキスカルスコープであるという点は"my"と同じであるが、
かならずしも、変数を新たに作るわけではない。

"our"によって宣言されたグローバル変数(パッケージ変数)は、まさにレキシカルスコープである。
従って、パッケージスコープではないので、パッケージスコープの違いを乗り越えられる。
(ファイルスコープは乗り越えられないが...)
この"our"が有効になるのは、 our $a と宣言したときであって、
その宣言文がかかれたPackageをuseしたときではない。

だから、次のような挙動となる

同じ変数名に対する、複数回の"our"宣言は、パッケージが違えば許可されています。
もし、同じパッケージ内でやってしまったら、 my 宣言を複数回したときのように警告を発します
但し、新規の値を割り当てる二回目の my 宣言とは異なり、
二回目の our 宣言は、ほとんど変化はない。

ourの正確な定義