LanX has asked for the wisdom of the Perl Monks concerning the following question:
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
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re: Hacking Debugger bugs connected to $^D (())
by tye (Sage) on Apr 25, 2013 at 01:41 UTC | |
by LanX (Saint) on Apr 25, 2013 at 01:47 UTC | |
|
Re: Hacking Debugger bugs connected to $^D
by Tommy (Chaplain) on Apr 24, 2013 at 18:53 UTC | |
by LanX (Saint) on Apr 24, 2013 at 19:31 UTC | |
by Laurent_R (Canon) on Apr 24, 2013 at 21:34 UTC | |
by LanX (Saint) on Apr 24, 2013 at 21:59 UTC |