В чем разница между лексическим и динамическим охватом в Perl?

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

Можно ли их кратко описать?

Ответы

Ответ 1

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

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

Посмотрите Perl-FAQ:

Ответ 3

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

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

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