Reputation: 915
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
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
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