答案 0 :(得分:14)
您可以考虑our
为包全局变量创建词法范围的别名。可以从任何地方访问包全局变量;这就是他们全球化的原因。但our
创建的名称仅在our
声明的词法范围内可见。
package A;
use strict;
{
our $var; # $var is now a legal name for $A::var
$var = 42; # LEGAL
}
say $var; # ILLEGAL: "global symbol $var requires explicit package name"
say $A::var; # LEGAL (always)
{
our $var; # This is the same $var as before, back in scope
$var *= 2; # LEGAL
say $var; # 84
}
答案 1 :(得分:7)
你已经有了一个很好的答案,但也许这也会有所帮助。
our
声明结合了my
和use vars
的各个方面。它的作用类似于use vars
,因为它声明了包变量;但是,以这种方式声明的变量是词法范围的,并且不能在声明它们的范围之外访问(除非您使用变量的完全限定名称)。此外,使用our
声明的变量在整个词法范围内都可见,甚至跨包边界。
这是我在一段时间后添加到Perl笔记中的表格。有关示例,请参阅this SO answer。
Scope/ Package
Namespace Variable Private New
---------------------------------------------------
my Lexical No Yes Yes
our Lexical Yes No No
use vars Package Yes No No