2013-07-17 15 views

回答

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编译用法:

our Foo $foo; 

这不能为全局变量来完成,而不our

+0

真的很好的答案! – none

2

正如可以从perldocs看到,our创建别名具有相同名称作为在当前包的 ED our可变包变量。

如果你在写,在它有多个包定义代码,你可以使用一个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 

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

+1

所有包变量都是全局变量。这个用法说明的是,除了满足“严格”之外,还有一个目的就是“我们的”。 – darch

+0

根据以下问题(http://stackoverflow.com/questions/845060/what-is-the-difference-between-my-and-our-in-perl),我们的变量被称为包和全局变量。我不知道谁相信。 – none

+0

@none:这里没有冲突。 '我们'声明了(全局变量的别名)。 – Borodin

2

全球,包变量是随时随地访问,strict是否到位与否,如果您指定的完全限定名称,即你的包名前缀它。所以我可以随时随地访问$main::variable

没有strict,如果你访问$variable,你还没有用my声明,Perl认为它是当前包中的包变量。 our可以用来显式声明包变量,但没有strict它并没有做太多的事情未申报的工作方式。

随着strict的到位,在声明出现的词法范围内,使用our声明的变量可以使用它们的本地名称以及它们的完全限定名称进行访问。这意味着要从两个子例程访问一个全局变量,您必须在两个子例程中声明它,或者在两个子例程之前声明它。当有未申报的全局相比

相关问题