【发布时间】:2011-06-08 07:24:00
【问题描述】:
例子:
~ $ re.pl
$ { my $abc = 10 ; $abc }
10
$ $abc
10
$
这是一个记录在案的问题吗?
【问题讨论】:
-
这实际上是 Perl ou 一个 shell 问题吗?
-
OK...原来的例子没有提到REPL。
例子:
~ $ re.pl
$ { my $abc = 10 ; $abc }
10
$ $abc
10
$
这是一个记录在案的问题吗?
【问题讨论】:
这似乎是Lexical::Persistence 中的一个错误,Devel::REPL 使用它来管理跨多个evals 持续存在的词法环境。
这是一个没有 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'};
我已针对该模块报告了 bug,我们将看看会发生什么!
还值得注意的是,Matt Trout(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 错误。
【讨论】:
peek_sub 中,这是获取子例程的词法变量的规范方法。 warn Dumper(peek_sub(sub { my $foo = shift; { my $abc = 10 }; return $foo; })); 有 $foo 和 $abc 的条目。 Eval::WithLexicals 不会遇到同样的问题,因为它不使用 PadWalker。
$a 和$b 是用于排序的特殊变量。见perldoc -f sort。
【讨论】:
如果您直接在 Perl 解释器中运行代码,则不会发生这种情况:
$ perl -we '{ my $abc = 10 ; print "($abc)\n"; }; print "($abc)\n";'
Name "main::abc" used only once: possible typo at -e line 1.
(10)
Use of uninitialized value $abc in concatenation (.) or string at -e line 1.
()
可能是您在Devel::REPL 中发现了一个错误。
【讨论】: