re.pl:变量在块内没有正确范围

时间:2011-06-08 07:24:00

标签: perl read-eval-print-loop

示例:

~ $ re.pl
$ { my $abc = 10 ; $abc }
10
$ $abc
10
$ 

这是记录在案的问题吗?

4 个答案:

答案 0 :(得分:6)

这似乎是Lexical::Persistence中的一个错误,Devel::REPL用来管理多个eval中持久存在的词汇环境。

这是没有Devel :: REPL的bug的演示。此代码错误地生成$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错误。

答案 1 :(得分:3)

$a$b是用于排序的特殊变量。见perldoc -f sort

答案 2 :(得分:2)

请勿使用$a$b

来自Perlvar(Perl预定义变量)文档:

  

<强> $ A    的 $ B

     

使用 sort() see sort时的特殊包变量。由于这种特殊性,$ a和$ b不需要声明(使用 use vars our() ),即使使用<强> strict 'vars' pragma。如果您希望能够在 my $a中使用它们,请不要使用 my $b sort() 对其进行词汇化比较块或功能。

答案 3 :(得分:0)

如果直接在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找到了错误。