В чем разница между лексическим и динамическим ограничением в Perl? - PullRequest
15 голосов
/ 12 декабря 2011

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

Может ли кто-нибудь описать их впроинструктировать

Ответы [ 3 ]

12 голосов
/ 12 декабря 2011

local ($ x) сохраняет старое значение глобальной переменной $ x и присваивает новое значение для продолжительности подпрограммы, которое видно в других функциях, вызываемых из этой подпрограммы.Это делается во время выполнения, так называемое динамическое определение объема.Функция local () всегда влияет на глобальные переменные, также называемые пакетными или динамическими переменными.

my ($ x) создает новую переменную, которая видна только в текущей подпрограмме.Это делается во время компиляции, поэтому это называется лексической или статической областью видимости.my () всегда влияет на закрытые переменные, также называемые лексическими переменными или (неправильно) статическими переменными (ly scoped).

Взгляните на Perl-FAQ :

10 голосов
/ 12 декабря 2011

MJD объяснил это в 1998 :

my создает локальную переменную. local нет.

6 голосов
/ 03 мая 2014

Я добавлю быстрый пример.

$var = "Global";

sub inner {
    print "inner:         $var\n";
}

sub changelocal {
    my $var = "Local";
    print "changelocal:   $var\n";

    &inner
}

sub changedynamic {
    local $var = "Dynamic";
    print "changedynamic: $var\n";

    &inner
}

&inner
&changelocal
&changedynamic

Это дает следующий вывод (комментарии добавлены).

inner:         Global  # Finds the global variable.
changedynamic: Dynamic # Dynamic variable overrides global.
inner:         Dynamic # Find dynamic variable now.
changelocal:   Local   # Local variable overrides global.
inner:         Global  # The local variable is not in scope so global is found.

Вы можете думать о динамической переменной как о способе маскирования глобальной функции, которую вы вызываете. Где лексические переменные видимости видны только из кода внутри ближайших фигурных скобок.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...