如何在调试器中使用perl 5.10功能?

时间:2010-08-22 01:24:40

标签: perl

我无法在perl调试器中评估'modern perl'代码。在调试文件中的代码时,它可以正常工作,但不能从提示符调试。

最小例子:

# activating 5-10 features with -E (it works)
$  perl -E 'say "x"'
x
# calling the debugger with -E
# it works for infile code but for prompt line code...
$  perl -dEbug    Loading DB routines from perl5db.pl version 1.33
    DB say "x"
    String found where operator expected at (eval 16)[/local-perl/lib/5.12.1/perl5db.pl:638] line 2, near "say "x""
    at (eval 16)[/local-perl/lib/5.12.1/perl5db.pl:638] line 2
        eval '($@, $!, $^E, $,, $/, $\\, $^W) = @saved;package main; $^D = $^D | $DB::db_stop;say "x";

[注意:“使用功能”也是如此:5.10'“]

我错过了什么吗?

1 个答案:

答案 0 :(得分:7)

这是一个有趣的问题,也是我从未想过的问题,所以对此赞不绝口。

我找到了问题here的引用,但它已经有一年了。但是,perl源的相关部分自那以后没有改变,可以看到here。基本上,如果您查看perl源代码中的toke.c,您会看到以下内容:

if (PL_perldb) {
    /* Generate a string of Perl code to load the debugger.
     * If PERL5DB is set, it will return the contents of that,
     * otherwise a compile-time require of perl5db.pl.  */

    const char * const pdb = PerlEnv_getenv("PERL5DB");
            ...
}
...
if (PL_minus_E)
    sv_catpvs(PL_linestr,
          "use feature ':5." STRINGIFY(PERL_VERSION) "';");

基本上,在处理-E标志之前加载调试器,因此在加载调试器时尚未启用这些功能。这样做的要点是,您当前无法使用-E命令-d。如果您想使用sayswitch或调试提示中的任何其他功能,您必须这样做:

  DB<1> use feature 'say'; say "x"
  x

我见过最接近解决方案的是:

  
      
  1. 将PERL5LIB中的perl5db.pl复制到PERL5LIB或当前目录中的某个位置,使用不同的名称,例如myperl5db.pl
  2.   
  3. 编辑myperl5db.pl以使用':5.10'; (或者只是'陈述',或者只是'说')在第一行。
  4.   
  5. 将环境变量PERL5DB设置为“BEGIN {require'myperl5db.pl'}”
  6.   

我在PerlMonks找到了。