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

时间:2013-07-17 20:42:17

标签: perl strict

our修饰符仅在严格编译指示处于活动状态时使用以允许使用全局变量,还是在严格关闭时甚至用于与普通全局变量不同的一些额外功能?

3 个答案:

答案 0 :(得分: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";

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

my  gives -1
our gives 42

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

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

您还可以使用fields pragma指定使用类型:

our Foo $foo;

如果没有our,则无法对全局变量进行此操作。

答案 1 :(得分:2)

perldocs可以看出,our为包变量创建了一个别名,其名称与当前包中的our ed变量相同

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

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

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

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

答案 2 :(得分:2)

全局,包变量可以在任何地方访问,无论strict是否到位,如果指定完全限定名称,即使用包名称作为前缀。所以我可以随时随地访问$main::variable

如果没有strict,如果您访问未使用$variable声明的my,Perl会认为它是当前包中的包变量。 our可以用来显式声明一个包变量,但没有strict它不会做任何事情,因为任何未声明的行为都会以相同的方式运行。

strict到位的情况下,使用our声明的变量可以使用它们的本地名称以及它们的完全限定名称在声明出现的词法范围中访问。这意味着要从两个子例程访问全局变量,您必须在两个子例程中声明它,或者在两个子例程之前将它们声明为它。