7

修飾子は、ourグローバル変数を使用できるようにするために厳密なプラグマがアクティブな場合にのみ使用されますか、それとも厳密がオフの場合に通常のグローバル変数とは異なるいくつかの追加機能に使用されますか?

4

3 に答える 3

5

はい、our宣言されていないグローバルと比較すると、宣言には追加の機能があります。しかし、これらはほとんど無関係です。

our(同じ名前の) グローバル変数へのレキシカル エイリアスを作成します。つまりpackage Fooour $bar$Foo::barは同じ変数を参照します。ただし、前者は狭いレキシカル スコープでのみ使用できます。

字句効果があるようourに、別名は次のように字句変数をシャドウすることもできますmy:

our $foo = 42; # give some value
my  $foo = -1; # same name, different value
say "my  gives $foo";
our $foo;      # reintroduce the alias; shadow lexical
say "our gives $foo";

宣言を削除してour厳密に実行しないと、明らかに出力が得られません

my  gives -1
our gives 42

と同様myに、attributesourなど、少し余分な宣言構文を使用できます。

use threads::shared;
our $foo :shared;

fieldsプラグマで使用するタイプを指定することもできます。

our Foo $foo;

これは、グローバル変数に対しては実行できませんour

于 2013-07-17T20:57:51.997 に答える
2

グローバルなパッケージ変数はstrict、完全修飾名を指定した場合、つまりパッケージ名をプレフィックスとして指定した場合、配置されているかどうかに関係なく、どこからでもアクセスできます。$main::variableそのため、いつでもどこでもアクセスできます。

なしで、で宣言していないものstrictにアクセスすると、Perl はそれが現在のパッケージのパッケージ変数であると見なします。パッケージ変数を明示的に宣言するために使用できますが、宣言されていないものは同じように動作するため、それがないとあまり効果がありません。$variablemyourstrict

with strictin place で宣言された変数はour、宣言が現れたレキシカルスコープで、ローカル名と完全修飾名を使用してアクセスできます。つまり、2 つのサブルーチンからグローバル変数にアクセスするには、両方のサブルーチン内で宣言するか、外側のスコープで両方の前に宣言する必要があります。

于 2013-07-17T20:57:16.667 に答える