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


person vivek_ratnaparkhi    schedule 24.11.2013    source источник


Ответы (2)


Вы не можете смешивать лексическую область видимости, используемую my, с глобальной областью имен переменных пакета (ключевое слово local можно использовать только для последней). Perl будет рассматривать $x в исходном коде как переменную с лексической областью видимости после того, как вы определили ее как таковую. Вы по-прежнему можете получить доступ к переменной пакета (используя $::x) - хотя это просто означало бы, что вы использовали две совершенно разные переменные, и не позволяли бы вам ссылаться ни на одну из них одновременно с $x.

Вы можете добиться чего-то очень похожего на то, что вы пытаетесь сделать, используя our вместо my:

our $x = "global\n";

Ключевое слово our создает псевдоним с лексической областью действия для переменной пакета.

Результат тогда:

global
local
global
person Neil Slater    schedule 24.11.2013
comment
вы должны явно указать, что local влияет только на переменные пакета - person ysth; 24.11.2013
comment
@ Нил Слейтер: Спасибо за ответ. Да, я знаю, что локализованы только глобальные переменные, я просто хотел знать, какова мотивация этих ограничений. - person vivek_ratnaparkhi; 24.11.2013
comment
@vivek ratnaparkhi: я не уверен в мотивации, но вероятны логические несоответствия при объединении локальных и лексических областей или, возможно, проблемы с производительностью, если интерпретатор Perl не может делать предположения о расположении данных. в переменных с лексической областью видимости. Скорее всего, это в принципе возможно, но потребует усилий для поддержки (т. е. ограничение не является произвольным, а защищает код, который не может поддерживать поведение) и имеет сомнительную ценность. - person Neil Slater; 24.11.2013

Я просто хотел знать, какова мотивация этих ограничений.

my считается создателем статических переменных.

local считается создателем переменных с динамической областью видимости.

Итак, в вашей программе есть две переменные с одинаковыми именами. Учитывая, что весь смысл my заключался в замене local, конечно, my имеет приоритет над local, а не наоборот. Вы бы потеряли преимущества my, если бы было наоборот.

person ikegami    schedule 24.11.2013