我无法在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'“]
我错过了什么吗?
答案 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
。如果您想使用say
,switch
或调试提示中的任何其他功能,您必须这样做:
DB<1> use feature 'say'; say "x"
x
我见过最接近解决方案的是:
- 将PERL5LIB中的perl5db.pl复制到PERL5LIB或当前目录中的某个位置,使用不同的名称,例如myperl5db.pl
- 编辑myperl5db.pl以使用':5.10'; (或者只是'陈述',或者只是'说')在第一行。
- 将环境变量PERL5DB设置为“BEGIN {require'myperl5db.pl'}”
醇>
我在PerlMonks找到了。