Похоже, что это ошибка в Lexical :: Persistence , которую Devel :: REPL использует для управления лексической средой, сохраняющейся в нескольких eval
с.
Вот демонстрация ошибки без Devel :: REPL.Этот код неправильно выдает значение $abc
, 10, даже если он находится во внутренней области.
use strict;
use warnings;
use Lexical::Persistence;
my $environment = Lexical::Persistence->new;
$environment->call(sub {
my $foo = shift;
{ my $abc = 10 };
return $foo;
});
print $environment->get_context('_')->{'$abc'};
Я сообщил о ошибке в модуле, посмотримчто происходит!
Стоит также отметить, что Мэтт Траут (основной автор нового лексического модуля персистентности Devel :: REPL) Eval :: WithLexicals делает не страдают от этой проблемы:
use strict;
use warnings;
use Eval::WithLexicals;
my $environment = Eval::WithLexicals->new;
print $environment->eval('{ my $abc = 10 ; $abc }'), "\n";
print $environment->eval('$abc'), "\n";
производит 10
, как и ожидалось, затем второй eval выдает ожидаемую Global symbol "$abc" requires explicit package name
ошибку.