Почему нельзя локализовать лексическую переменную в Perl?
У меня ниже код 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 не позволяет его локализовать?
2 ответа
Я просто хотел знать, что является причиной этого ограничения.
my
считается создателем статически ограниченных переменных.
local
считается создателем динамически изменяемых переменных.
Итак, в вашей программе есть две переменные с одинаковыми именами. Учитывая весь смысл my
должен был заменить local
, конечно my
имеет приоритет над local
и не наоборот. Вы бы потеряли преимущества my
если бы было наоборот
Вы не можете смешивать лексическую сферу, используемую my
с глобальной областью имен переменных в пространстве имен (ключевое слово local
может использоваться только на последнем). Perl будет лечить $x
в источнике в виде переменной лексической области, как только вы определили ее как таковую. Вы все еще можете получить доступ к переменной пакета (используя $::x
) - хотя это будет означать, что у вас есть две совершенно разные переменные, и вы не сможете ссылаться ни на одну из них одновременно $x
,
Вы можете достичь чего-то очень похожего на то, что вы пытаетесь сделать, используя our
вместо my
:
our $x = "global\n";
our
Ключевое слово создает псевдоним с лексической областью для переменной пакета.
Выходные данные тогда:
global
local
global