【发布时间】:2009-05-22 18:11:55
【问题描述】:
我知道你可以使用文件测试操作符 -B 来测试一个文件是否是二进制文件,但是 Perl 是如何在内部实现的呢?
【问题讨论】:
标签: perl
我知道你可以使用文件测试操作符 -B 来测试一个文件是否是二进制文件,但是 Perl 是如何在内部实现的呢?
【问题讨论】:
标签: perl
来自perldoc -f -B:
-T和-B开关的工作方式如下。 第一个区块或 检查文件的 so 是否有奇怪的字符,例如奇怪的 设置高位的控制代码或字符。如果太多 发现奇怪字符 (>30%),这是一个-B文件; 否则它是一个-T文件。此外,任何包含 null 的文件 第一个块被认为是一个二进制文件。 如果-T或-B用于文件句柄,检查当前 IO 缓冲区 而不是第一个块。-T和-B都返回 true 一个空文件,或在测试文件句柄时EOF的文件。 因为你必须读取一个文件才能进行-T测试,所以在大多数情况下 您想首先对文件使用-f的场合,如 “next unless -f $file && -T $file”。
【讨论】:
根据Learning Perl一书的第11章:
答案是 **Perl 作弊**:它打开文件,查看前几千字节,然后做出有根据的猜测。如果它看到很多空字节、不寻常的控制字符和设置了高位的字节,那么它看起来就像一个二进制文件。如果没有太多奇怪的东西,那么它看起来像文本。它有时会猜错。如果一个文本文件有很多瑞典语或法语单词(可能有用高位集表示的字符,如一些 ISO-8859 变体,甚至可能是 Unicode 版本),它可能会欺骗 Perl 将其声明为二进制。所以它并不完美,但如果您需要将源代码与编译文件或 HTML 文件与 PNG 分开,这些测试应该可以解决问题。
【讨论】: