我知道你可以使用文件测试运算符-B来测试文件是否是二进制文件,但Perl如何在内部实现它?
答案 0 :(得分:27)
来自perldoc -f -B
:
-T
和-B
开关的工作方式如下。 第一块或 因此检查文件是否有奇怪的字符,例如奇怪的 控制代码或高位设置的字符。如果太多了 找到奇怪的字符(> 30%),它是-B
文件; 否则它是-T
文件。此外,任何包含null的文件 第一个块被认为是二进制文件。 如果-T
或-B
在文件句柄上使用,检查当前的IO缓冲区 而不是第一块。-T
和-B
都返回true 测试文件句柄时的空文件或EOF
处的文件。 因为你必须阅读一个文件来进行-T
测试 您希望首先对文件使用-f
的情况,如 “next unless -f $file && -T $file
”。
答案 1 :(得分:10)
根据 Learning Perl 一书的第11章:
答案是** Perl作弊**:它打开文件,查看前几千字节,并进行有根据的猜测。如果它看到很多空字节,异常控制字符和高位设置的字节,那么它看起来像一个二进制文件。如果没有太多奇怪的东西,那么它看起来像文字。它有时会猜错。如果一个文本文件有很多瑞典语或法语单词(可能有高位设置的字符,如某些ISO-8859-something变体,甚至可能是Unicode版本),它可能会欺骗Perl声明它是二进制的。所以它并不完美,但如果您需要将源代码与编译文件或PNG中的HTML文件分开,这些测试应该可以解决问题。