【问题标题】:re.pl: Variable not properly scoped inside blockre.pl:变量在块内的范围不正确
【发布时间】:2011-06-08 07:24:00
【问题描述】:

例子:

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

这是一个记录在案的问题吗?

【问题讨论】:

标签: perl read-eval-print-loop


【解决方案1】:

这似乎是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 错误。

【讨论】:

  • 再深入研究一下 Lexical::Persistence 的代码,似乎该错误实际上在PadWalkerpeek_sub 中,这是获取子例程的词法变量的规范方法。 warn Dumper(peek_sub(sub { my $foo = shift; { my $abc = 10 }; return $foo; }));$foo$abc 的条目。 Eval::WithLexicals 不会遇到同样的问题,因为它不使用 PadWalker。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    不要使用$a$b

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

    $a $b

    使用 sort()see sort 时的特殊包变量。由于这种特殊性,即使使用 @987654328,也不需要声明 $a 和 $b(使用 use varsour()) @ 杂注。如果您希望能够在 sort() 比较块中使用它们,请不要使用 my $amy $b 对它们进行词汇化或函数。

    【讨论】:

      【解决方案4】:

      如果您直接在 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 中发现了一个错误。

      【讨论】:

        猜你喜欢
        • 2022-01-17
        • 2018-12-21
        • 2016-05-21
        • 1970-01-01
        • 2010-10-26
        • 1970-01-01
        • 1970-01-01
        • 2020-09-15
        • 1970-01-01
        相关资源
        最近更新 更多