由于“\0”[Perl],tkdiff 和 diff 不起作用

tkdiff and diff does not work because of "\0" [Perl]

我偶然发现了以下 Perl 代码:

my $val = $x->insertEl($data) or die $y->ErrorMessage();
print "[=10=]$val[=10=]";

在这种情况下,[=13=] 是什么意思? 此脚本创建一个调试日志,其中 [=14=]$val\ 被写入此日志(我将 debugFun() 更改为 print 以便更容易解释)。如果我尝试使用其他文件进行 tkdiff,它将失败并出现以下错误:

diff failed: Files file1 and file2 differ. Child process exited abnormally

此外,如果我使用常规 diff 命令,它将打印:

diff failed: Files file1 and file2 differ.

如果我删除 [=13=] 它将正确打印,并且 tkdiff 和 diff 将工作。所以问题是 [=13=] 但为什么呢?

代码用 null characters 填充值。虽然它们确实有一些用途,但我不确定它们在日志文件中是做什么的。

正如 melpomene 的 link 到 diffutils#Binary 所示,这些工具会受到这些字符的影响,首先是决定文件是二进制文件。该手册提供了 -a 开关,在该开关下 diff 仍然将文件作为文本进行比较,但这只会有助于更详细地报告差异;文件 不同

perl -wE'say "noway"'   > t1.out
perl -wE'say "no[=10=]way"' > t2.out
wc -c t1.out t2.out              #--> 6 and 7

因此您必须删除那些空字符。

如果有充分的理由打印它们,那么这是清除它们的一种方法

perl -pe's/\x00//g' t2.out > nonull_t2.out

否则只需更改印刷品,让它们一开始就不存在。