четверг, 13 августа 2009 г.

Perl Closure - последний бастион пал

Perl предоставляет разработчику полную свободу действий и доступа к любым данным.

Правда в Perl6 частично отходят от этого принципа, но это лишь внешняя уступка современным объектно-ориентированным предрассудкам, которые легко обходятся при помощи ролей.

Perl не ограничивает свободу, но и не препятствует ограничению свободы. Вы можете создать полностью закрытые области данных при помощи замыканий. Замыкание - это закрытый и нерушимый бастион в свободном мире Perl.

Однако на данный момент этот бастион пал.
При помощи новой версии модуля PadWalker можно не только проникнуть за стены крепости-замыкания, но и изменить непосредственно то, что находиться за этими стенами.

Рассмотрим пример:

use PadWalker;

sub foo {
my $foo = shift;
sub { print "$foo\n" };
}

my $foo = foo(3);
$foo->();

PadWalker::set_closed_over($foo, { '$foo' => \5 });
$foo->();

В этом примере мы изменили значение переменной $foo c 3 на 5.
Внимание, если эта переменная не read-only, то модификацию замыкания необходимо производить следующим способом:

PadWalker::set_closed_over($foo, { '$foo' => \ do { my $foo = 5 } });

Как говориться в старой военной мудрости: "Нет такой крепости, которую не возможно было бы взять".

1 комментарий:

Chas. Owens комментирует...

Even in C++, you can muck about with private variables from the outside if you are properly motivated and have enough information, the trick is that you leave yourself open to weird bugs if you do.