Eug*_*ash 10 variables perl lexical-scope
来自"我们的" perldoc:
我们有与我相同的范围规则,但不一定会创建变量.
这意味着声明的变量our
不应该跨文件可见,因为file是最大的词法范围.但是这是错误的.为什么?
hob*_*bbs 14
您可以考虑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
}
Run Code Online (Sandbox Code Playgroud)
你已经有了一个很好的答案,但也许这也会有所帮助.
该our
声明结合了my
和的方面use vars
.它的功能类似于use vars
声明包变量; 但是,以这种方式声明的变量是词法范围的,并且不能在声明它们的范围之外访问(除非您使用变量的完全限定名称).此外,声明的变量our
在整个词法范围内都是可见的,甚至跨越包边界.
这是我在一段时间后添加到Perl笔记中的表格.例如,请参阅此SO答案.
Scope/ Package
Namespace Variable Private New
---------------------------------------------------
my Lexical No Yes Yes
our Lexical Yes No No
use vars Package Yes No No
Run Code Online (Sandbox Code Playgroud)