Я добавлю быстрый пример.
$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.
Вы можете думать о динамической переменной как о способе маскирования глобальной функции, которую вы вызываете. Где лексические переменные видимости видны только из кода внутри ближайших фигурных скобок.