当前位置: 动力学知识库 > 问答 > 编程问答 >

dynamic scope - Why can't localize lexical variable in Perl?

问题描述:

I have below Perl code.

use warnings;

use strict;

my $x = "global\n";

sub a {

print $x;

}

sub b {

local $x = "local\n";

a();

}

a();

b();

a();

Even if $x has scope inside b() subroutine why Perl doesn't allows to localize it ?

网友答案:

I just wanted to know what is the motivation behind this constraints.

my is thought of as a creator of statically scoped variables.

local is thought of as a creator of dynamically scoped variables.

So you have two similarly-named variables in your program. Given the whole point of my was to replace local, of course my takes precedence over local and not the other way around. You would lose the benefits of my if it was the other way around.

网友答案:

You cannot mix the lexical scope used by my with the namespaced global scope of package variables (the keyword local may only be used on the latter). Perl will treat $x in the source as the lexically-scoped variable once you have defined it as such. You can still access the package variable (using $::x) - although that would just mean you had two entirely separate variables in use, and would not allow you to refer to either at the same time as $x.

You can achieve something very similar to what you appear to be trying to do by using our instead of my:

our $x = "global\n";

The our keyword creates a lexically-scoped alias to a package variable.

Output is then:

global
local
global
分享给朋友:
您可能感兴趣的文章:
随机阅读: