our VARLIST
our TYPE VARLIST
our VARLIST : ATTRS
our TYPE VARLIST : ATTRS

our 為目前套件中同名的套件 (亦即全域) 變數建立一個詞彙別名,以在目前詞彙範圍內使用。

our 具有與 mystate 相同的範圍規則,表示它僅在詞彙範圍內有效。與同時宣告新 (詞彙) 變數的 mystate 不同,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;

ouruse vars 不同,後者允許在受影響的封裝中使用不限定名稱,但跨越範圍。