我们在Perl中定义的变量和普通全局变量之间有什么区别吗?

7

our修饰符只有在启用strict严格模式时才能使用,以允许使用全局变量,还是即使在关闭strict严格模式时也用于一些与普通全局变量不同的额外功能?

3个回答

5

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

our创建了一个全局变量(同名)的词法别名。也就是说,在包Foo中,our $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声明并且没有使用strict模式运行,显然不会得到输出。
my  gives -1
our gives 42

就像my一样,our也可以使用额外的声明语法,例如属性

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

您可以使用fields编译指示符来指定类型:
our Foo $foo;

如果是全局变量,没有使用our是不能实现的。


2
正如您从 perldocs 中看到的,our 创建一个别名,指向与当前包中以 our 形式声明的变量名称相同的包变量。

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

package Foo:
our $bar = 42;  # $bar is an alias for $Foo::bar

package Baz;
print $bar;     # prints '42', since $bar is $Foo::bar

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

1
所有的包变量都是全局变量。这种用法表明了our除了满足strict之外还有其他用途。 - darch
根据以下问题(https://dev59.com/XXRA5IYBdhLWcg3wvQlh),我们的变量被称为包变量和全局变量。我不知道该相信谁。 - Acsor
这里没有冲突。our 声明(别名)包(全局)变量。 - Borodin
我在Stack Exchange上浏览了半打类似的问题,并在答案中看到了两倍以上,而你是第一个以我能理解的方式解释它的人。 - Liz Av

2

全局、包变量可以在任何地方访问,无论是否启用strict,只要您指定完全限定名称,即在变量名前加上包名称。因此,我可以随时随地访问$main::variable

如果没有启用strict,并且您访问了未使用my声明的$variable,Perl会认为它是当前包中的一个包变量。our可用于显式声明包变量,但是没有启用strict时,未声明的任何内容都会以相同的方式处理。

启用strict后,使用our声明的变量可以在其所在的词法作用域中使用其本地名称和完全限定名称进行访问。这意味着要从两个子例程中访问全局变量,必须在两个子例程内声明它,或在外部范围中声明它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接