Правда в 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 } });
Как говориться в старой военной мудрости: "Нет такой крепости, которую не возможно было бы взять".