10

从“我们的” perldoc

our 与 my 具有相同的范围规则,但不一定创建变量。

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

4

2 回答 2

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
}
于 2010-09-02T10:46:02.220 回答
7

您已经有了一个很好的答案,但也许这也会有所帮助。

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
于 2010-09-02T13:05:54.200 回答