10

「私たちの」perldocから:

our は my と同じスコープ規則を持っていますが、必ずしも変数を作成するとは限りません。

これはour、file が最大のレキシカル スコープであるため、 で宣言された変数が複数のファイルにわたって表示されてはならないことを意味します。しかし、これは真実ではありません。なんで?

4

2 に答える 2

14

パッケージのグローバル変数に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
}
于 2010-09-02T10:46:02.220 に答える
7

あなたはすでに良い答えを持っていますが、おそらくこれも役に立ちます。

宣言は とのour側面を結合myuse 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
于 2010-09-02T13:05:54.200 に答える