7

修饰符是否our仅在 strict pragma 处于活动状态以允许使用全局变量时使用,或者当 strict 关闭时它甚至用于与普通全局变量不同的一些额外功能?

4

3 回答 3

5

是的,our与未声明的全局变量相比,声明可以具有其他功能。但这些在很大程度上是无关紧要的。

our创建一个全局变量(同名)的词法别名。也就是说,在package Fooour $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;

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

our Foo $foo;

对于没有our.

于 2013-07-17T20:57:51.997 回答
2

正如您从perldocs中看到的,创建一个与当前包中的ed 变量our同名的包变量的别名。our

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

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

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

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

于 2013-07-17T20:51:46.877 回答
2

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

没有strict,如果你访问$variable你没有用 声明的my,Perl 假定它是当前包中的一个包变量。our可用于显式声明包变量,但没有strict它不会做很多事情,因为任何未声明的行为都是相同的。

strict就地,声明的变量可以在our声明出现的词法范围内使用它们的本地名称以及它们的完全限定名称进行访问。这意味着要从两个子例程访问一个全局变量,您必须要么在两个子例程中声明它,要么在它们之前在外部范围内声明它。

于 2013-07-17T20:57:16.667 回答