В чем разница между лексическим и динамическим охватом в Perl?
Насколько я знаю, оператор my
должен объявлять переменные, которые действительно лексически охвачены, а динамическое масштабирование выполняется с помощью оператора local
для объявления переменной.
Можно ли их кратко описать?
Ответы
Ответ 1
local ($ x) сохраняет прежнее значение глобальной переменной $x и назначает новое значение для продолжительности подпрограммы, которая является видимый в других функциях, вызываемых из этой подпрограммы. Готово во время выполнения, поэтому называется динамическим охватом. local() всегда влияет глобальные переменные, также называемые переменными пакета или динамическими переменными.
my ($ x) создает новую переменную, которая видна только в текущей подпрограмма. Это делается во время компиляции, поэтому оно называется лексическим или статический охват. my() всегда влияет на частные переменные, также называемые лексические переменные или (неверно) статические переменные с переменными.
Посмотрите Perl-FAQ:
Ответ 2
MJD объяснил это в 1998 году:
my
создает локальную переменную. local
не работает.
Ответ 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.
Вы можете думать о динамической переменной как о способе маскировки глобального для функций, которые вы вызываете. Где, поскольку лексические скользящие переменные видны только из кода внутри ближайших скобок.