$var = 'm'; # ГЛОБАЛЬНУЮ $var можно скрыть через local
print "1[main]='$var'\n"; # выведет: 1[main]='m'
sub1();
print "7[main]:'$var'\n"; # выведет: 7[main]:'s'
sub sub1 {
print "2[sub1]='$var'";
$var = 's'; # изменена $var из main!
print "-->'$var'\n"; # выведет: 2[sub1]='m'-->'s'
local $var = '1'; # значение ГЛОБАЛЬНОЙ $var скрывается
print "3[sub1]#'$var'\n"; # выведет: 3[sub1]#'1'
sub2();
print "6[sub1]:'$var'\n"; # выведет: 6[sub1]:'1'
}
sub sub2 { # видна ГЛОБАЛЬНАЯ $var из sub1
print "4[sub2]:'$var'";
$var = 'z'; # изменена $var из sub1!
print "-->'$var'\n"; # выведет: 4[sub2]:'1'-->'z'
my $var = '2'; # изменена $var из sub2
print "5[sub2]='$var'\n"; # выведет: 5[sub2]='2'
}
Сравнивая эту программу с предыдущим примером, можно отметить следующие отличия.
1Переменную
2Действие
3При выходе из подпрограммы
В современных программах в основном используют функцию my для задания переменным лексической области видимости. Оправданное применение функции
1Временное скрытие значения глобальных переменных, в том числе у специальных переменных.
2Временная модификация отдельных элементов массивов и хэшей, даже имеющих лексическую область видимости.
3Создание локальных файловых манипуляторов в версиях Perl до 5.6, не поддерживающих использование лексических переменных для хранения файловых манипуляторов.
С помощью ссылок, подпрограмм и лексических переменных создаются очень интересные информационные объекты, называемые замыканиями (closure). Они основаны на известном принципе, что объект ссылки сохраняется до тех пор, пока на него указывает хотя бы одна ссылка. А переменная может хранить ссылку на значение лексической переменной, динамически создаваемой при входе в блок и автоматически уничтожаемой при выходе из него. Это видно из следующего примера:
my $ref; # переменная для хранения ссылки
{ # в блоке создается
my $lex_var = 'Суслик'; # переменная $lex_var
$ref = \$lex_var; # в $ref помещена
} # ссылка на переменную
# $lex_var освобождается при выходе из блока
print "Ты суслика видишь? И я не вижу. А он есть: ";
print ${$ref}; # объект ссылки доступен через $ref
Подобным образом можно хранить ссылку на анонимную подпрограмму, из которой будут доступны динамически созданные лексические переменные. Такая подпрограмма, вызванная по ссылке, будет иметь доступ к области видимости этих переменных. Приведем пример простого замыкания:
my $ref; # переменная для хранения ссылки
{ # в блоке создается
my $lex_var = 'Верблюд'; # переменная $lex_var
$ref = sub { return $lex_var }; # в $ref помещена
} # ссылка на подпрограмму
# $lex_var освобождается при выходе из блока
print &$ref; # объект возвращается подпрограммой по $ref
Вильям Л Саймон , Вильям Саймон , Наталья Владимировна Макеева , Нора Робертс , Юрий Викторович Щербатых
Зарубежная компьютерная, околокомпьютерная литература / ОС и Сети, интернет / Короткие любовные романы / Психология / Прочая справочная литература / Образование и наука / Книги по IT / Словари и Энциклопедии