Чтение онлайн

на главную - закладки

Жанры

Язык программирования Perl

Шохирев Михаил Васильевич

Шрифт:

local $_; # временно скрыть значение буферной переменной

local ($global1, $equant) = (1, 2); # правильно

Посмотрите, как изменится результат, если переписать предыдущий пример с использованием local вместо my в подпрограмме sub1:

$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 Переменную $var в главной программе пришлось сделать глобальной, так как local не может скрывать лексические переменные.

2 Действие local распространяется до конца подпрограммы sub1, а также на вызываемую подпрограмму sub2.

3 При выходе из подпрограммы sub1 действие local заканчивается и восстанавливается значение, которое содержала глобальная переменная $var до применения к ней local.

В современных программах в основном используют функцию my для задания переменным лексической области видимости. Оправданное применение функции local в Perl обычно сводится к следующим случаям:

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

Замыкания можно создавать динамически при выполнении программы. Приведем пример функции, которая при каждом вызове создает замыкание и возвращает ссылку на него. При этом каждый раз создается новый экземпляр лексической переменной, замкнутый от доступа извне:

sub make_closure { # функция создания замыканий:

my ($animal) = @_; # В лексической переменной

# сохраняется аргумент функции

my $ref2closure = sub { # и ссылка на

# анонимную подпрограмму,

return $animal; # которая имеет доступ

}; # к лексической переменной.

return $ref2closure; # возвращает ссылку на подпрограмму

}

# создаем 2 замыкания, сохраняя в них разные значения:

my $camel1 = make_closure('дромадер'); # одногорбый верблюд

my $camel2 = make_closure('бактриан'); # двугорбый верблюд

print &$camel1, ' ', $camel2->; # доступ по ссылкам

В этой лекции изложены основные сведения о подпрограммах в Perl. Мы продолжим изучение подпрограмм в лекции 13, где будет рассказано о библиотечных модулях, и в лекции 14, посвященной объектному программированию на Perl.

Поделиться:
Популярные книги

Снега

Чепурин Юлий Петрович
Поэзия:
драматургия
5.00
рейтинг книги
Снега

Прапорщик. Назад в СССР. Книга 6

Гаусс Максим
6. Второй шанс
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Прапорщик. Назад в СССР. Книга 6

Золотой ворон

Сакавич Нора
5. Все ради игры
Фантастика:
зарубежная фантастика
5.00
рейтинг книги
Золотой ворон

Убивать чтобы жить 6

Бор Жорж
6. УЧЖ
Фантастика:
боевая фантастика
космическая фантастика
рпг
5.00
рейтинг книги
Убивать чтобы жить 6

Эволюционер из трущоб. Том 2

Панарин Антон
2. Эволюционер из трущоб
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
Эволюционер из трущоб. Том 2

Белые погоны

Лисина Александра
3. Гибрид
Фантастика:
фэнтези
попаданцы
технофэнтези
аниме
5.00
рейтинг книги
Белые погоны

Русские дети (сборник)

Фрай Макс
Проза:
современная проза
5.60
рейтинг книги
Русские дети (сборник)

Геном хищника. Книга девятая

Гарцевич Евгений Александрович
9. Я - Легенда!
Фантастика:
боевая фантастика
рпг
попаданцы
5.00
рейтинг книги
Геном хищника. Книга девятая

Хозяин Теней 3

Петров Максим Николаевич
3. Безбожник
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Хозяин Теней 3

Ожерелье Странника

Хаггард Генри Райдер
Приключения:
исторические приключения
7.50
рейтинг книги
Ожерелье Странника

Бастард Императора. Том 15

Орлов Андрей Юрьевич
15. Бастард Императора
Фантастика:
городское фэнтези
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Бастард Императора. Том 15

Локки 6. Потомок бога

Решетов Евгений Валерьевич
6. Локки
Фантастика:
аниме
фэнтези
5.00
рейтинг книги
Локки 6. Потомок бога

Газлайтер. Том 14

Володин Григорий Григорьевич
14. История Телепата
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Газлайтер. Том 14

Двойник короля 17

Скабер Артемий
17. Двойник Короля
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Двойник короля 17