【发布时间】:2010-03-03 00:11:09
【问题描述】:
在调试 Perl 代码(在命令行调试器中,perl -d)时,我最讨厌的一个事实是,错误地打印(通过x 命令)一个巨大的数据结构的内容肯定会永远冻结你的终端半时打印了 100 页数据。特别是如果这种情况发生在速度较慢的网络中。
因此,我希望能够限制x 打印的数据量。
我看到了两种方法 - 如果有人知道该怎么做,我愿意尝试任何一种。
限制调试器打印中任何单个命令的数据量。
更好的是,以某种方式将内置的
x命令替换为自定义 Perl 方法(该方法将计算数据结构的“大小”,并拒绝在未经确认的情况下打印其内容)。
我特别问“如何用自定义代码替换 x”- 构建一个足够好的“数据结构是否太大”Perl 方法是我可以自己做的事情,虽然我看到了足够多的陷阱阻止“完美”的努力成为一项相当令人沮丧的努力。哎呀,仅仅做 Data::Dumper->Dump 并获取字符串的长度就可以了:)
请注意,我非常清楚如何通过递归检查数据结构层来手动避免该问题(例如打印 ref、打印键/数组元素的计数等...)...关键是我希望能够避免不加思索地输入x $huge_pile_of_data - 或者在将所述大量数据填充为标量的错误时绊倒。
【问题讨论】:
-
我经常使用你问题中提到的简单方法,将这个子程序添加到我正在调试的代码中:
sub xx { use Data::Dumper; print Dumper(@_) }。然后我在调试器中使用xx $foo而不是x $foo。正如你所说,一个人可以通过在打印前检查长度来使xx()提供更全面的服务。 -
@FM - 但这假设您有远见,知道 $foo 很大。我的整个问题都是偶然发生的。
-
我的建议并不要求你假设任何关于
$foo的事情。相反,它需要改变习惯:一直使用xx,而不是x——主要是因为Data::Dumper的输出比x的输出更好,还因为使用您自己的转储子程序可以轻松根据手头问题的需要自定义行为。当然,这只是一个想法。