「私たちの」perldocから:
our は my と同じスコープ規則を持っていますが、必ずしも変数を作成するとは限りません。
これはour
、file が最大のレキシカル スコープであるため、 で宣言された変数が複数のファイルにわたって表示されてはならないことを意味します。しかし、これは真実ではありません。なんで?
「私たちの」perldocから:
our は my と同じスコープ規則を持っていますが、必ずしも変数を作成するとは限りません。
これはour
、file が最大のレキシカル スコープであるため、 で宣言された変数が複数のファイルにわたって表示されてはならないことを意味します。しかし、これは真実ではありません。なんで?
パッケージのグローバル変数にour
レキシカル スコープのエイリアスを作成することを検討できます。パッケージ グローバルはどこからでもアクセスできます。それが彼らをグローバルにするものです。しかし、によって作成された名前は、宣言our
のレキシカル スコープ内でのみ表示されます。our
package A;
use strict;
{
our $var; # $var is now a legal name for $A::var
$var = 42; # LEGAL
}
say $var; # ILLEGAL: "global symbol $var requires explicit package name"
say $A::var; # LEGAL (always)
{
our $var; # This is the same $var as before, back in scope
$var *= 2; # LEGAL
say $var; # 84
}
あなたはすでに良い答えを持っていますが、おそらくこれも役に立ちます。
宣言は とのour
側面を結合my
しuse vars
ます。use vars
パッケージ変数を宣言するという点で と同様に機能します。ただし、この方法で宣言された変数はレキシカル スコープであり、変数が宣言されたスコープ外にアクセスすることはできません (変数の完全修飾名を使用しない限り)。さらに、 with で宣言された変数は、our
レキシカル スコープ全体、さらにはパッケージの境界を越えて表示されます。
しばらく前に Perl ノートに追加した表を次に示します。例については、この SO answerを参照してください。
Scope/ Package
Namespace Variable Private New
---------------------------------------------------
my Lexical No Yes Yes
our Lexical Yes No No
use vars Package Yes No No