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 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 ?
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
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.