I hacked my perldebugger in a way to act as a REPL, i.e. instantly printing the returnvalue from every executed line.¹
from time to time I have weird output, like
DB<100> sub tst {} => 0
which is wrong, since sub returns nothing (i.e. empty list in list context)
$ perl -e 'use Data::Dumper; print Dumper eval "sub tst {}"' $
digging into the code of perl5db.pl helped me identifying the source of the problem:
The debugger automatically prepends code to the command-line before evaling it.
Essentially the directive '$^D=$^D;' causes the problem
$ perl -e 'use Data::Dumper; print Dumper eval "\$^D=\$^D;sub tst {}"' $VAR1 = '0';
I'm not sure why this is happening, IMHO it's a bug in the implementation of eval and/or debug mode.
The original line in perl5db.pl is
$evalarg = "\$^D = \$^D | \$DB::db_stop;\n$cmd";
my workaround now is using an explicit do { ...}
$evalarg = "\$^D = \$^D | \$DB::db_stop;\ndo {$cmd}";
:~$ perl -e 'use Data::Dumper; print Dumper eval "\$^D=\$^D;do {sub ts +t {}}"' :~$
This should hopefully not cause any new side effects... but is still a weird phenomenon.
Anyone here who can enlighten me, or give me a better workaround?
Cheers Rolf
( addicted to the Perl Programming Language)
¹) see also YAPC talk
In reply to Hacking Debugger bugs connected to $^D by LanX
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |