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

Eug*_*ash 10 variables perl lexical-scope

来自"我们的" perldoc:

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

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

hob*_*bbs 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
}
Run Code Online (Sandbox Code Playgroud)


FMc*_*FMc 7

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

our声明结合了my和的方面use vars.它的功能类似于use vars声明包变量; 但是,以这种方式声明的变量是词法范围的,并且不能在声明它们的范围之外访问(除非您使用变量的完全限定名称).此外,声明的变量our在整个词法范围内都是可见的,甚至跨越包边界.

这是我在一段时间后添加到Perl笔记中的表格.例如,请参阅此SO答案.

              Scope/     Package
              Namespace  Variable    Private    New
---------------------------------------------------
my            Lexical    No          Yes        Yes
our           Lexical    Yes         No         No
use vars      Package    Yes         No         No
Run Code Online (Sandbox Code Playgroud)

  • 人们必须记住,包不会创建范围:[知道什么创建了范围](http://www.effectiveperlprogramming.com/blog/48). (3认同)