our
為目前套件中同名的套件 (亦即全域) 變數建立一個詞彙別名,以在目前詞彙範圍內使用。
our
具有與 my
或 state
相同的範圍規則,表示它僅在詞彙範圍內有效。與同時宣告新 (詞彙) 變數的 my
和 state
不同,our
僅建立現有變數的別名:同名的套件變數。
這表示當 use strict 'vars'
生效時,our
讓您可以使用套件變數,而不用套件名稱限定它,但僅在 our
宣告的詞彙範圍內。這會立即套用,甚至在同一個陳述式內。
package Foo;
use v5.36; # which implies "use strict;"
$Foo::foo = 23;
{
our $foo; # alias to $Foo::foo
print $foo; # prints 23
}
print $Foo::foo; # prints 23
print $foo; # ERROR: requires explicit package name
這會運作,即使套件變數之前未曾使用過,因為套件變數在第一次使用時就會產生。
package Foo;
use v5.36;
our $foo = 23; # just like $Foo::foo = 23
print $Foo::foo; # prints 23
由於變數在 use strict 'vars'
下會立即合法,只要範圍內沒有同名的變數,您甚至可以在同一個陳述式中再次參考套件變數。
package Foo;
use v5.36;
my $foo = $foo; # error, undeclared $foo on right-hand side
our $foo = $foo; # no errors
如果列出多個變數,清單必須置於括號中。
our($bar, $baz);
一個 our
宣告宣告了一個封裝變數的別名,這個變數會在整個詞法範圍內可見,甚至跨越封裝邊界。變數所在的封裝會在宣告時決定,而不是在使用時。這表示以下行為成立
package Foo;
our $bar; # declares $Foo::bar for rest of lexical scope
$bar = 20;
package Bar;
print $bar; # prints 20, as it refers to $Foo::bar
允許多個具有相同名稱的 our
宣告在同一個詞法範圍內,如果它們在不同的封裝中。如果它們碰巧在同一個封裝中,Perl 會發出警告,如果你有要求的話,就像多個 my
宣告一樣。與第二個 my
宣告不同,它會將名稱繫結到一個新的變數,第二個 our
宣告在同一個封裝中,在同一個範圍內,只是多餘的。
use warnings;
package Foo;
our $bar; # declares $Foo::bar for rest of lexical scope
$bar = 20;
package Bar;
our $bar = 30; # declares $Bar::bar for rest of lexical scope
print $bar; # prints 30
our $bar; # emits warning but has no other effect
print $bar; # still prints 30
一個 our
宣告也可以有一個與它關聯的屬性清單。
TYPE 和 ATTRS 的確切語意和介面仍在演進中。TYPE 目前繫結到 fields pragma 的使用,而屬性使用 attributes pragma 處理,或者,從 Perl 5.8.0 開始,也可以透過 Attribute::Handlers 模組處理。請參閱 "perlsub 中的 Private Variables via my()" 以取得詳細資訊。
請注意,對於括號清單,undef
可以用作虛擬佔位符,例如跳過初始值的指定
our ( undef, $min, $hour ) = localtime;