【问题标题】:Why can't localize lexical variable in Perl?为什么不能在 Perl 中本地化词法变量?
【发布时间】:2013-11-24 15:44:38
【问题描述】:

我有以下 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 dynamic-scope


    【解决方案1】:

    您不能将my 使用的词法范围与包变量的命名空间全局范围混合(关键字local 只能用于后者)。一旦您将源代码中的$x 定义为词法范围变量,Perl 就会将其视为词法范围变量。你仍然可以访问包变量(使用$::x)——尽管这意味着你有两个完全独立的变量在使用,并且不允许你同时引用$x

    您可以通过使用our 而不是my 来实现与您似乎想要做的非常相似的事情:

    our $x = "global\n";
    

    our 关键字创建包变量的词法范围别名。

    然后输出:

    global
    local
    global
    

    【讨论】:

    • 你应该明确提到local 只影响包变量
    • @Neil Slater:感谢您的回答。是的,我知道只有全局变量是本地化的,我只是想知道这种约束背后的动机是什么。
    • @vivek ratnaparkhi:我不确定动机,但是在组合本地和词法范围时可能会出现逻辑不一致,或者如果 Perl 可能会出现性能问题解释器不能对数据在词法范围变量中的位置做出假设。原则上很可能是可能的,但需要努力支持(即限制不是任意的,而是保护无法支持该行为的代码)并且具有值得怀疑的价值。
    【解决方案2】:

    我只是想知道这些限制背后的动机是什么。

    my 被认为是静态范围变量的创建者。

    local 被认为是动态范围变量的创建者。

    因此,您的程序中有两个名称相似的变量。鉴于my 的全部意义在于替换local,当然my 优先于local 而不是相反。如果反过来,您将失去my 的好处。

    【讨论】:

      猜你喜欢
      • 2011-07-27
      • 2011-12-09
      • 1970-01-01
      • 1970-01-01
      • 2020-09-02
      • 2013-10-26
      • 1970-01-01
      • 1970-01-01
      • 2015-05-16
      相关资源
      最近更新 更多