Perl如何知道文件是二进制文件?

Jos*_*don 16 perl

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

小智 27

来自perldoc -f -B:

-T-B交换机的工作方式如下.检查文件的第一个块左右是否有奇数字符,例如奇怪的控制代码或高位设置的字符.如果找到太多奇怪的字符(> 30%),它就是一个-B文件; 否则它是一个-T文件.此外,第一个块中包含null的任何文件都被视为二进制文件.如果-T-B 在文件句柄上使用,则检查当前IO缓冲区而不是第一个块.这两个-T-B一个空文件,或者在文件返回true EOF测试文件句柄时.因为您必须读取文件才能进行-T测试,所以在大多数情况下,您首先要-f对文件使用a ,如" next unless -f $file && -T $file"中所示.


TSt*_*per 10

根据Learning Perl一书的第11章:

答案是**Perl作弊**:它打开文件,查看前几千字节,并进行有根据的猜测.如果它看到很多空字节,异常控制字符和高位设置的字节,那么它看起来像一个二进制文件.如果没有太多奇怪的东西,那么它看起来像文字.它有时会猜错.如果一个文本文件有很多瑞典语或法语单词(可能有高位设置的字符,如某些ISO-8859-something变体,甚至可能是Unicode版本),它可能会欺骗Perl声明它是二进制的.所以它并不完美,但如果您需要将源代码与编译文件或PNG中的HTML文件分开,这些测试应该可以解决问题.