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
的全局变量无法做到这一点。