Perl如何判断文件是二进制文件?

20

我知道你可以使用文件测试运算符 -B 来测试文件是否为二进制文件,但是Perl内部是如何实现的呢?

2个回答

31

来自 perldoc -f -B:

选项 -T-B 的作用如下。 文件的前一块或者说是其头部会被检查是否存在奇怪的字符,例如奇怪的控制码或高位设置的字符。如果发现太多奇怪的字符(>30%),那么它就是一个二进制文件;否则它就是一个文本文件。同时,任何在头部包含空字符的文件都被视为二进制文件。 如果在文件句柄上使用了 -T-B,则当前 IO 缓冲区将被检查,而不是文件的头部。 当测试一个文件句柄时,无论是空文件还是到达 EOF-T-B 均返回 true。 因为你需要读取一个文件才能进行 -T 测试,所以大多数情况下,你需要先对文件使用 -f 进行测试,例如 "next unless -f $file && -T $file"。

1
有一个使用魔术状态缓存字符“_”的机会:“next unless -f $file and -T _”。 - glenn jackman

11
根据《学习Perl》第11章的说法:
答案是**Perl欺骗**:它打开文件,查看前几千个字节,并做出有根据的猜测。如果它看到许多空字节、不寻常的控制字符和高位设置的字节,那就像是二进制文件。如果没有太多奇怪的东西,那就像文本。它有时会猜错。如果一个文本文件有很多瑞典语或法语单词(可能使用高位设置表示某些ISO-8859某个变体甚至Unicode版本的字符),它可能会欺骗Perl声明它是二进制的。所以它不是完美无缺的,但如果你需要将源代码与已编译文件或HTML文件与PNG文件分离,这些测试应该能起到作用。

我不确定是否会认为那是“作弊”。毕竟没有更好的方法。 - friedo
嗯,既然他们打开了文件,这有点作弊了,你不觉得吗? - TStamper
1
@TStamper 有什么方法不被视为作弊吗?这就像拥有一个公文包并询问它是否装满了文件或钱 - 只有通过查看内部才能回答。 - Francisco Zarabozo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接