假设我正在调试一个 Perl 脚本,其中调用了该脚本,如下所示:
perl -d test.pl > file.txt
与 test.pl
:
print "Hello world\n";
my $a = 2;
print "$a\n";
1;
有没有办法将脚本的输出从调试器内重新重定向到调试器的标准输出,以便打印语句在调试器的滚动窗口上发送它们的输出?
如果没有,有没有办法从调试器中发出命令来清除到目前为止的所有内容file.txt
?
您可以在调试时评估任意 Perl,而 DB::OUT 是调试器为输出打开的文件句柄。所以只需使用select DB::OUT
:
给定测试:
use v5.14;
say 1;
say 2;
say 3;
这是一个演示使用 select 的日志:
$ perl -d test > log
Loading DB routines from perl5db.pl version 1.33
Editor support available.
Enter h or `h h' for help, or `man perldebug' for more help.
main::(test:2): say 1;
DB<1> n
main::(test:3): say 2;
DB<1> select DB::OUT
DB<2> n
2
main::(test:4): say 3;
DB<2> n
3
Debugged program terminated. Use q to quit or R to restart,
use o inhibit_exit to avoid stopping after program termination,
h q, h R or h o to get additional info.
DB<2> q
$ cat log
1
尽管@Julian Fondren 有效,但远程工作需要进行一些小改动。
给定测试:
use v5.14;
say 1;
say 2;
say 3;
在终端 1(此处为 localhost:12345)上的任何主机和端口上启动侦听器:
$ nc -v -l localhost -p 12345
对于 readline 支持,请使用rlwrap(您也可以使用 on perl -d
):
$ rlwrap nc -v -l localhost -p 12345
并在另一个终端(比如终端 2)上开始测试:
$ PERLDB_OPTS="RemotePort=localhost:12345" perl -d test
端子 1 上的输入/输出:
Connection from 127.0.0.1:42994
Loading DB routines from perl5db.pl version 1.49
Editor support available.
Enter h or 'h h' for help, or 'man perldebug' for more help.
main::(test:2): say 1;
DB<1> n
main::(test:3): say 2;
DB<1> select $DB::OUT
DB<2> n
2
main::(test:4): say 3;
DB<2> n
3
Debugged program terminated. Use q to quit or R to restart,
use o inhibit_exit to avoid stopping after program termination,
h q, h R or h o to get additional info.
DB<2>
端子 2 上的输出:
1
注意美元
select $DB::OUT
注意:我不介意有人解释这种变化背后的魔力,但不要问我,因为我不知道。