我有下面的Perl代码。
use warnings;
use strict;
my $x = "globaln";
sub a {
print $x;
}
sub b {
local $x = "localn";
a();
}
a();
b();
a();
即使$x在b()子例程中有作用域,为什么Perl不允许本地化它?
不能将my
使用的词法作用域与包变量的命名空间全局作用域混合使用(关键字local
只能用于后者)。一旦您定义了源中的$x
,Perl就会将其视为词法范围的变量。您仍然可以访问包变量(使用$::x
),尽管这只意味着您有两个完全独立的变量在使用,并且不允许您与$x
同时引用这两个变量。
通过使用our
而不是my
:,您可以实现与您想要做的非常相似的事情
our $x = "globaln";
our
关键字为包变量创建一个词法范围的别名。
输出为:
global
local
global
我只是想知道这种限制背后的动机是什么。
my
被认为是静态作用域变量的创建者。
local
被认为是动态范围变量的创建者。
因此,您的程序中有两个名称相似的变量。考虑到my
的全部目的是取代local
,当然my
优先于local
,而不是相反。如果相反,您将失去my
的好处。