【发布时间】:2011-04-07 06:32:57
【问题描述】:
【问题讨论】:
标签: perl variables lexical-scope
【问题讨论】:
标签: perl variables lexical-scope
您已经有了一个很好的答案,但也许这也会有所帮助。
our 声明结合了my 和use vars 的各个方面。它的功能类似于use vars,因为它声明了包变量;但是,以这种方式声明的变量是词法范围的,不能在声明它们的范围之外访问(除非您使用变量的完全限定名称)。此外,使用our 声明的变量在其整个词法范围内可见,甚至跨越包边界。
这是我不久前添加到 Perl 笔记中的表格。示例见this SO answer。
Scope/ Package
Namespace Variable Private New
---------------------------------------------------
my Lexical No Yes Yes
our Lexical Yes No No
use vars Package Yes No No
【讨论】:
perl -le 'package Foo; $x += 10; print $x; package B; $x += 10; print $x'。也许有比“范围”更好的词来描述该示例的情况?感谢您的意见。
package Bar、$Foo::x 里面可能不是看不见,但它是模糊的。或者也许有人可以说它隐藏在命名空间后面,这可能是我正在寻找的替代词。如果我们允许使用黑魔法,即使是词法范围的变量在其词法域之外也不是完全不可见的。在任何情况下,作用域和命名空间都不是无关的。如果不出意外,他们分享了一些潜在的动机。
您可以考虑使用our 为包全局变量创建一个词法范围的别名。包全局变量可以从任何地方访问;这就是使它们全球化的原因。但our 创建的名称仅在our 声明的词法范围内可见。
package A;
use strict;
{
our $var; # $var is now a legal name for $A::var
$var = 42; # LEGAL
}
say $var; # ILLEGAL: "global symbol $var requires explicit package name"
say $A::var; # LEGAL (always)
{
our $var; # This is the same $var as before, back in scope
$var *= 2; # LEGAL
say $var; # 84
}
【讨论】:
strict 的豁免,那么perl -le 'our $foo = 42; package A; print "$foo $main::foo"' 42 42 将打印与perl -le 'use vars qw/$foo/; $foo = 42; package A; print "$foo $main::foo"' 相同的内容,这是一个豁免,我们不需要@ 987654328@.