Wednesday, February 2, 2011

Замыкания и предопределенные переменные Perl

Замыкание в Perl - это функция (процедура), которая ссылается на одну или более лексические переменные, объявленные вне функции. Такая функция "запоминает" окружение, в котором она была создана.

Довольно распространенная ошибка при создании замыканий - использование в теле функции специальных переменных Perl ($_, $@, $1, etc). Все эти переменные являются глобальными, соответственно создать замыкание с их использованием невозможно.

Пример:
my @a = map sub { print "$_n" }, 1..3;
$_->() for @a;

CODE(0x284769ec)
CODE(0x284769ec)
CODE(0x284769ec)


Кстати, еще одно интересное наблюдение. При создании анонимных функций в цикле, ссылка на функцию, не являющуюся замыканием, имеет постоянный адрес. Ссылка же на замыкание будет все время разная для каждого "экземпляра" замыкания:
my @a = map { my $x = $_; sub { $x } } 1..3;
print "$_n" for @a;

CODE(0x284768d4)
CODE(0x28428a14)
CODE(0x28428bf4)

No comments:

Post a Comment