由于“ \ 0”,tkdiff和diff无法使用[Perl]

时间:2018-08-21 20:50:20

标签: perl diff

我在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,但为什么呢?

1 个答案:

答案 0 :(得分:4)

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

正如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

否则只需更改打印,以使它们不在第一位。

相关问题