パッケージ変数を宣言する(レキシカルスコープ)
our
は、パッケージの中の同じ名前のパッケージ(つまりグローバル)変数に、
レキシカルエイリアス(現在のスコープの中だけで有効な別名)を付けます。
our
は、宣言された変数はレキシカルスコープの中だけで有効になる、という点では
my
や state
と同じスコーピング規則を持ちます。
一方、my
や state
はどちらも新たな(レキシカル)変数を宣言するのに対し、
our
は既存の変数に別名、つまり、同じ名前のパッケージ変数を生成するだけです。
これは、use strict 'vars'
が有効なとき、
our
はパッケージ名を付けた変数に資格を与えることなしに、パッケージ変数を使えるようにします。
ただし、それが使えるのは、our
宣言のレキシカルスコープの中だけです。
package MyPackage;
use strict;
use warnings;
# パッケージ変数を宣言して初期値をセット
$MyPackage::name = 'Taro';
{
our $name; # $MyPackage::name の別名を生成 (このブロックの中だけで有効)
print $name, "\n"; # Taro
}
print $MyPackage::name, "\n"; # Taro
print $name; # エラーになる
パッケージ変数が事前に定義されておらず、いきなり現れたとしても、機能します。
package MyPackage;
use strict;
use warnings;
our $name = 'Taro'; # $MyPackage::name = 'Taro' と同じ
print $MyPackage::name, "\n"; # Taro
print $name, "\n"; # Taro