【问题标题】:Are there any differences between our defined variables and normal global variables in Perl?我们定义的变量和 Perl 中的普通全局变量有什么区别吗?
【发布时间】:2013-07-16 14:22:41
【问题描述】:

our 修饰符是仅在 strict pragma 处于活动状态以允许使用全局变量时使用,还是在 strict 关闭时用于与普通全局变量不同的一些额外功能?

【问题讨论】:

    标签: perl strict


    【解决方案1】:

    是的,与未声明的全局变量相比,our 声明可以具有其他功能。但这些在很大程度上是无关紧要的。

    our 创建一个全局变量(同名)的词法别名。也就是说,在package Fooour $bar$Foo::bar 中指的是同一个变量。但是,前者只能在严格的词法范围内使用。

    由于our具有词法效果,别名也可以用my遮蔽词法变量:

    our $foo = 42; # give some value
    my  $foo = -1; # same name, different value
    say "my  gives $foo";
    our $foo;      # reintroduce the alias; shadow lexical
    say "our gives $foo";
    

    如果您剥离 our 声明并在没有严格的情况下运行它,这显然不会给出输出

    my  gives -1
    our gives 42
    

    就像myour 可以采用一些额外的声明语法,例如属性

    use threads::shared;
    our $foo :shared;
    

    您还可以使用fields pragma 指定使用类型:

    our Foo $foo;
    

    对于没有our 的全局变量,这是无法做到的。

    【讨论】:

      【解决方案2】:

      全局,包变量可以在任何地方访问,无论strict 是否存在,如果你指定完全限定的名称,即你用包名作为前缀。所以我可以随时随地访问$main::variable

      没有strict,如果你访问$variable,你没有用my 声明,Perl 假定它是当前包中的一个包变量。 our 可用于显式声明包变量,但如果没有 strict,它的作用不大,因为任何未声明的行为都是相同的。

      使用strict,使用our 声明的变量可以在声明出现的词法范围内使用它们的本地名称以及它们的完全限定名称进行访问。这意味着要从两个子例程访问一个全局变量,您必须要么在两个子例程中声明它,要么在它们之前在外部范围内声明它。

      【讨论】:

        【解决方案3】:

        perldocs 中可以看出,our 创建了一个包变量的别名,该别名与当前包中的oured 变量同名

        如果您编写的代码中包含多个包定义,则可以使用oured 变量在模块之间传递别名变量。

        package Foo:
        our $bar = 42;  # $bar is an alias for $Foo::bar
        
        package Baz;
        print $bar;     # prints '42', since $bar is $Foo::bar
        

        因此,与全局变量无关的用法。

        【讨论】:

        • 所有包变量都是全局变量。这个用法说明了our除了满足strict之外还有一个目的。
        • 根据下面的问题 (stackoverflow.com/questions/845060/…) 我们的变量被称为包变量和全局变量。我不知道谁信。
        • @none:这里没有冲突。 our 声明包(全局)变量(别名)。
        • 我在 Stack Exchange 中浏览了六个类似的问题,并且在答案中找到了两倍,而您是第一个以我能理解的方式实际解释它的人。
        猜你喜欢
        • 2018-04-23
        • 2016-01-17
        • 2019-11-17
        • 1970-01-01
        • 2011-01-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-15
        相关资源
        最近更新 更多