代码之家  ›  专栏  ›  技术社区  ›  Eugene Yarmash

为什么用“our”声明的变量在文件中可见?

  •  10
  • Eugene Yarmash  · 技术社区  · 14 年前

    从“我们的” perldoc :

    我们的作用域规则与我的相同,但不一定创建变量。

    这意味着 our 不应在文件之间可见,因为文件是最大的词法作用域。但事实并非如此。为什么?

    2 回复  |  直到 4 年前
        1
  •  14
  •   hobbs    14 年前

    你可以考虑 our 创建词汇范围的 别名 到包全局变量。包globals可以从任何地方访问;这就是它们全球化的原因。但是这个名字是由 我们的 宣言。

    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
    }
    
        2
  •  7
  •   Community CDub    7 年前

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

    这个 our 宣言结合了 my use vars 使用变量 因为它声明了包变量;但是,以这种方式声明的变量是词汇范围的,不能在声明它们的范围之外访问(除非使用变量的完全限定名)。另外,用 在整个词汇范围内都是可见的, 甚至跨越包边界 .

    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