our

パッケージ変数を宣言する(レキシカルスコープ)

構文

解説

our は、パッケージの中の同じ名前のパッケージ(つまりグローバル)変数に、 レキシカルエイリアス(現在のスコープの中だけで有効な別名)を付けます。

our は、宣言された変数はレキシカルスコープの中だけで有効になる、という点では mystate と同じスコーピング規則を持ちます。 一方、mystate はどちらも新たな(レキシカル)変数を宣言するのに対し、 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