我的一个调试Perl代码的烦恼(在命令行debbugger,perl -d
)是错误地打印(通过x
命令)大型数据结构的内容被保证冻结的事实你的终端永远半打印100页的数据。特别是如果这种情况发生在缓慢的网络中。
因此,我希望能够限制x
打印的数据量。
我看到两种方法 - 如果有人知道怎么做,我愿意尝试。
限制调试器中任何单个命令的数据量。
更好的是,以某种方式用自定义Perl方法替换内置x
命令(这将计算数据结构的“大小”,并拒绝打印其内容而不进行确认)。
我特别问“如何用自定义代码替换x
” - 构建一个“足够好”的数据结构太大了“Perl方法是我可以自己做的事情而不需要太多努力我看到足够的陷阱阻止了“完美”的一个令人沮丧的努力。哎呀,只是做Data :: Dumper->转储并获取字符串的长度可能会起到作用:)
请注意,我非常清楚如何通过递归检查数据结构层来手动避免这个问题(例如打印ref,打印键/数组元素的数量等等)......整个重点是我希望能够不假思索地轻轻地键入x $huge_pile_of_data
- 或者绊倒将大量数据填充到应该是标量的错误中。
答案 0 :(得分:12)
x
命令采用可选参数来显示最大深度。这与将数据量限制为N页不完全相同,但它对于防止过载非常有用。
DB<1> %h = (a => { b => { c => 1 } } )
DB<2> x %h
0 'a'
1 HASH(0x1d5ff44)
'b' => HASH(0x1d61424)
'c' => 1
DB<3> x 2 %h
0 'a'
1 HASH(0x1d5ff44)
'b' => HASH(0x1d61424)
您可以通过o
命令指定要打印的默认深度,例如
DB<1>o dumpDepth=1
将其添加到.perldb
文件,以将其应用于所有调试器会话。
否则,看起来x
命令调用DB::dumpit()
,它只是dumpval.pl
的包装器(或者更具体地说是它定义的main::dumpValue()
子包)。您可以根据需要修改/替换该脚本。不过,我不确定你是如何让它互动的。
答案 1 :(得分:8)
调试器中的|
命令将另一个命令的输出传送给你的寻呼机,例如
DB<1> |x %huge_datastructure