use strict;
my $var = 'm'; # лексическая $var в main
print "1(main)='$var'\n"; # выведет: 1(main)='m'
sub1();
print "7(main):'$var'\n"; # выведет: 7(main):'z'
sub sub1 {
print "2(sub1)='$var'";
$var = 's'; # изменяется $var из main!
print "-->'$var'\n"; # выведет: 2(sub1)='m'-->'s'
my $var = '1'; # изменена $var из sub1
print "3(sub1)='$var'\n"; # выведет: 3(sub1)='1'
sub2();
# снова видима $var1 из sub1
print "6(sub1):'$var'\n"; # выведет: 6(sub1):'1'
}
sub sub2 { # снова видима $var из main
print "4(sub2):'$var'";
$var = 'z'; # изменяется $var из main!!
print "-->'$var'\n"; # выведет: 4(sub2):'s'-->'z'
my $var = '2'; # изменена $var1 из sub2
print "5(sub2)='$var'\n"; # выведет: 5(sub2)='2'
}
Обратите внимание, что лексическая переменная $var, объявленная в главной программе, видима в обеих подпрограммах sub1 и sub2, поскольку они статически объявлены в рамках той же программы. Но при выполнении программы в подпрограмме sub2 не видима переменная $var, объявленная в процедуре sub1. Из приведенного примера видно, что после объявления в подпрограмме лексических переменных с помощью my(), изменения этих переменных не затрагивают других переменных с теми же именами. Поэтому, чтобы избежать нежелательного изменения значений переменных в других частях программы, рекомендуется всегда объявлять для переменных лексическую область видимости. Проконтролировать наличие объявлений для переменных в программе поможет прагма use strict. Другая разновидность лексических переменных, описываемых с помощью функции our, будет рассмотрена в следующей лекции.
В Perl имеется функция local(), также влияющая на область видимости переменных. Многие считают, что более удачным названием для нее было бы save(), потому что ее основное назначение - скрыть текущее значение глобальных переменных. Эта функция не создает локальных переменных, а делает "локальными" значения существующих глобальных переменных в текущей подпрограмме, блоке, eval или программном файле. Это значит, что после выполнения local текущие значения указанных переменных сохраняются в скрытом стеке, и новые значения переменных будут видимы вплоть до выхода из выполняемой подпрограммы, блока или файла, после чего восстанавливаются сохраненные значения переменных. На время действия local переменные остаются глобальными, поэтому новые временные значения переменных будут видимы и в вызываемых подпрограммах. Из-за временного характера действия функции local иногда говорят, что она описывает динамическую область видимости. Несколько переменных, чьи значения делаются временно скрытыми при помощи local, должны заключаться в круглые скобки, как показано ниже:
local $_; # временно скрыть значение буферной переменной
local ($global1, $equant) = (1, 2); # правильно
Посмотрите, как изменится результат, если переписать предыдущий пример с использованием local вместо my в подпрограмме sub1: