我在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
,但为什么呢?
答案 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
否则只需更改打印,以使它们不在第一位。