修飾子は、our
グローバル変数を使用できるようにするために厳密なプラグマがアクティブな場合にのみ使用されますか、それとも厳密がオフの場合に通常のグローバル変数とは異なるいくつかの追加機能に使用されますか?
3 に答える
はい、our
宣言されていないグローバルと比較すると、宣言には追加の機能があります。しかし、これらはほとんど無関係です。
our
(同じ名前の) グローバル変数へのレキシカル エイリアスを作成します。つまりpackage Foo
、our $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
。
グローバルなパッケージ変数はstrict
、完全修飾名を指定した場合、つまりパッケージ名をプレフィックスとして指定した場合、配置されているかどうかに関係なく、どこからでもアクセスできます。$main::variable
そのため、いつでもどこでもアクセスできます。
なしで、で宣言していないものstrict
にアクセスすると、Perl はそれが現在のパッケージのパッケージ変数であると見なします。パッケージ変数を明示的に宣言するために使用できますが、宣言されていないものは同じように動作するため、それがないとあまり効果がありません。$variable
my
our
strict
with strict
in place で宣言された変数はour
、宣言が現れたレキシカルスコープで、ローカル名と完全修飾名を使用してアクセスできます。つまり、2 つのサブルーチンからグローバル変数にアクセスするには、両方のサブルーチン内で宣言するか、外側のスコープで両方の前に宣言する必要があります。