【发布时间】:2013-07-16 14:22:41
【问题描述】:
our 修饰符是仅在 strict pragma 处于活动状态以允许使用全局变量时使用,还是在 strict 关闭时用于与普通全局变量不同的一些额外功能?
【问题讨论】:
our 修饰符是仅在 strict pragma 处于活动状态以允许使用全局变量时使用,还是在 strict 关闭时用于与普通全局变量不同的一些额外功能?
【问题讨论】:
是的,与未声明的全局变量相比,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 的全局变量,这是无法做到的。
【讨论】:
全局,包变量可以在任何地方访问,无论strict 是否存在,如果你指定完全限定的名称,即你用包名作为前缀。所以我可以随时随地访问$main::variable。
没有strict,如果你访问$variable,你没有用my 声明,Perl 假定它是当前包中的一个包变量。 our 可用于显式声明包变量,但如果没有 strict,它的作用不大,因为任何未声明的行为都是相同的。
使用strict,使用our 声明的变量可以在声明出现的词法范围内使用它们的本地名称以及它们的完全限定名称进行访问。这意味着要从两个子例程访问一个全局变量,您必须要么在两个子例程中声明它,要么在它们之前在外部范围内声明它。
【讨论】:
从perldocs 中可以看出,our 创建了一个包变量的别名,该别名与当前包中的oured 变量同名。
如果您编写的代码中包含多个包定义,则可以使用oured 变量在模块之间传递别名变量。
package Foo:
our $bar = 42; # $bar is an alias for $Foo::bar
package Baz;
print $bar; # prints '42', since $bar is $Foo::bar
因此,与全局变量无关的用法。
【讨论】:
our除了满足strict之外还有一个目的。
our 声明包(全局)变量(别名)。