our修饰符仅在启用严格编译指示以允许使用全局变量时才使用吗,还是在严格禁用时甚至用于某些不同于正常全局变量的附加功能?

最佳答案

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

our为全局变量(名称相同)创建一个词法别名。也就是说,在package 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声明并在没有严格限制的情况下运行它,显然不会提供输出

my  gives -1
our gives 42


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

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


您还可以指定fields编译指示使用的类型:

our Foo $foo;


没有our的全局变量无法做到这一点。

09-10 02:48