从“我们的” perldoc:
our 与 my 具有相同的范围规则,但不一定创建变量。
这意味着声明的变量our
不应该跨文件可见,因为文件是最大的词法范围。但是这是错误的。为什么?
您可以考虑为包全局变量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
}
您已经有了一个很好的答案,但也许这也会有所帮助。
该our
声明结合了my
和的各个方面use vars
。它的功能类似于use vars
声明包变量;但是,以这种方式声明的变量是词法范围的,不能在声明它们的范围之外访问(除非您使用变量的完全限定名称)。此外,用 声明的变量our
在其整个词法范围内都是可见的,甚至跨包边界也是如此。
这是我不久前添加到我的 Perl 笔记中的一张表。例如,请参阅此 SO answer。
Scope/ Package
Namespace Variable Private New
---------------------------------------------------
my Lexical No Yes Yes
our Lexical Yes No No
use vars Package Yes No No