2013-07-17 14 views

答えて

5

はい、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のように、ourは、少し余分な宣言構文をとることができます。属性:

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

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

our Foo $foo; 

これはourせずに、グローバル変数のために行うことはできません。

+0

本当に良い答えです! – none

2

あなたがperldocsからわかるように、ourは、現在のパッケージでour編変数と同じ名前のパッケージ変数にエイリアスを作成します。

複数のパッケージ定義を持つコードを書く場合は、our ed変数を使用して、モジュール間でエイリアス化された変数を渡すことができます。

package Foo: 
our $bar = 42; # $bar is an alias for $Foo::bar 

package Baz; 
print $bar;  # prints '42', since $bar is $Foo::bar 

このように、グローバル変数とは何の関係もありません。

+1

すべてのパッケージ変数はグローバル変数です。この使用法が示すことは、「厳格」を満たすこととは別に、「私たちの」目的があることです。 – darch

+0

次の質問(http://stackoverflow.com/questions/845060/what-is-the-difference-between-my-and-our-in-perl)によれば、変数はパッケージ変数およびグローバル変数と呼ばれます。私は誰が信じているのか分からない。 – none

+0

@none:ここには競合はありません。 'our'はパッケージ(グローバル変数)の(別名)を宣言します。 – Borodin

2

グローバル変数は、strictのどちらかに、どこにでもアクセスできます。完全修飾名を指定すると、パッケージ名に接頭辞を付けます。だからいつでもどこでも$main::variableにアクセスできます。

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

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

関連する問題