为什么不能在 Perl 中本地化词法变量?



我有下面的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的好处。

相关内容

  • 没有找到相关文章

最新更新