3

我有以下 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 不允许本地化它?

4

2 回答 2

4

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

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

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

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

于 2013-11-24T17:44:50.977 回答
4

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

您可以通过使用our代替my

our $x = "global\n";

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

输出是:

global
local
global
于 2013-11-24T15:56:25.380 回答