perl - 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
为什么?
解决方案
代码用空字符填充值。虽然它们确实有一些用途,但我不确定它们以日志文件为生。
正如 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
否则只需更改打印,以便它们首先不存在。
推荐阅读
- javascript - Filling HTML form from Node.js server
- java - 在 Spring 提供的课程上应用建议?
- python - 在python中将字典切片低于某个键值
- r - glm - 正确指定的模型,在 R 中没有预测质量
- javascript - 从客户端 JavaScript 可恢复上传?
- c# - 各种类型变量序列化后的字节形式
- servlets - J2EE - 过滤器`doFilter`方法没有被调用
- mysql - MySQL第一条件匹配优先级
- json - 如何保证 Swift 4 中的 JSON 有效?
- python-2.7 - 为图像分割任务创建 HDF5 格式