Почему нельзя локализовать лексическую переменную в 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
Другие вопросы по тегам