Perl中我们定义的变量和普通全局变量之间是否有任何差异?

Acs*_*sor 7 perl strict

our修改仅使用时严格编译激活使用全局变量,让或者甚至用于从正常的全局变量不同的一些额外的功能时严格熄灭?

amo*_*mon 5

是的,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";
Run Code Online (Sandbox Code Playgroud)

如果你删除our声明并运行它没有严格,这显然不会给出输出

my  gives -1
our gives 42
Run Code Online (Sandbox Code Playgroud)

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

use threads::shared;
our $foo :shared;
Run Code Online (Sandbox Code Playgroud)

您还可以使用fieldspragma 指定使用类型:

our Foo $foo;
Run Code Online (Sandbox Code Playgroud)

没有这个全局变量就无法做到这一点our.