首页 > 解决方案 > tkdiff 和 diff 因为 "\0" [Perl] 而不起作用

问题描述

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

my $val = $x->insertEl($data) or die $y->ErrorMessage();
print "\0$val\0";

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

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

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

diff failed: Files file1 and file2 differ.

如果我将其删除,\0它将正确打印,并且 tkdiff 和 diff 将起作用。所以问题是\0为什么?

标签: perldiff

解决方案


代码用空字符填充值。虽然它们确实有一些用途,但我不确定它们以日志文件为生。

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

perl -wE'say "noway"'   > t1.out
perl -wE'say "no\0way"' > t2.out
wc -c t1.out t2.out              #--> 6 and 7

所以你必须删除那些空字符。

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

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

否则只需更改打印,以便它们首先不存在。


推荐阅读