thatisvivek
thatisvivek

Reputation: 915

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 ?

Upvotes: 4

Views: 2895

Answers (2)

ikegami
ikegami

Reputation: 386331

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.

Upvotes: 4

Neil Slater
Neil Slater

Reputation: 27207

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

Upvotes: 4

Related Questions