our
修饰符只有在启用strict严格模式时才能使用,以允许使用全局变量,还是即使在关闭strict严格模式时也用于一些与普通全局变量不同的额外功能?
是的,与未声明的全局变量相比,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
是不能实现的。
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
全局、包变量可以在任何地方访问,无论是否启用strict
,只要您指定完全限定名称,即在变量名前加上包名称。因此,我可以随时随地访问$main::variable
。
如果没有启用strict
,并且您访问了未使用my
声明的$variable
,Perl会认为它是当前包中的一个包变量。our
可用于显式声明包变量,但是没有启用strict
时,未声明的任何内容都会以相同的方式处理。
启用strict
后,使用our
声明的变量可以在其所在的词法作用域中使用其本地名称和完全限定名称进行访问。这意味着要从两个子例程中访问全局变量,必须在两个子例程内声明它,或在外部范围中声明它。
our
除了满足strict
之外还有其他用途。 - darchour
声明(别名)包(全局)变量。 - Borodin