【问题标题】:How does Perl know a file is binary?Perl 如何知道文件是二进制文件?
【发布时间】:2009-05-22 18:11:55
【问题描述】:

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

【问题讨论】:

    标签: perl


    【解决方案1】:

    来自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”。

    【讨论】:

    • 有机会使用神奇的统计缓存字符“_”:“next unless -f $file and -T _”
    【解决方案2】:

    根据Learning Perl一书的第11章:

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

    【讨论】:

    • 我不知道我是否会认为这是“作弊”。好像真的没有更好的办法。
    • 好吧,既然打开了文件,那就是作弊,你不觉得
    • @TStamper 什么是不被视为作弊的方式?这就像拿着一个公文包,问它是装满文件还是装满钱——你只能通过看里面来回答。
    猜你喜欢
    • 2012-02-05
    • 2011-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-07
    • 1970-01-01
    • 2012-08-04
    相关资源
    最近更新 更多