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