为什么在文件中可以使用“我们的”声明变量?

时间:2010-09-02 10:25:41

标签: perl variables lexical-scope

来自“我们的”perldoc

  

我们有与我相同的范围规则,但不一定会创建变量。

这意味着用our声明的变量不应该在文件中可见,因为file是最大的词法范围。但是这是错误的。为什么呢?

2 个答案:

答案 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声明结合了myuse 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