Я знаю, что вы можете использовать оператор проверки файлов -B, чтобы проверить, является ли файл двоичным, но как Perl реализует это внутри?
Как Perl знает, что файл двоичный?
Ответ 1
От perldoc -f -B:
Переключатели-Tи-Bработают следующим образом. Первый блок или поэтому файл рассматривается для нечетных символов, таких как странные управляющие коды или символы с высоким набором бит. Если слишком много найдены странные символы ( > 30%), его файл-B; в противном случае это файл a-T. Кроме того, любой файл, содержащий null в первый блок считается двоичным файлом. Если-Tили-Bиспользуется на дескрипторе файла, проверяется текущий буфер ввода-вывода а не первый блок. Оба-Tи-Bвозвращают true в нулевой файл или файл вEOFпри проверке дескриптора файла. Поскольку вы должны прочитать файл, чтобы выполнить тест-T, на большинстве вы хотите сначала использовать-fдля файла, как в "next unless -f $file && -T $file".
Ответ 2
Согласно главе 11 книги Learning Perl:
Ответ: ** Perl-читы **: он открывает файл, просматривает первые несколько тысяч байт и дает обоснованное предположение. Если он видит много нулевых байтов, необычных управляющих символов и байтов с высоким набором бит, то это выглядит как двоичный файл. Если это не очень странно, тогда это выглядит как текст. Иногда это ошибочно. Если текстовый файл содержит много шведских или французских слов (которые могут иметь символы, представленные с высоким набором бит, как некоторый вариант ISO-8859 или, возможно, даже версию Unicode), он может обмануть Perl в объявлении его двоичным. Поэтому он не идеален, но если вам нужно отделить исходный код от скомпилированных файлов или файлов HTML из PNG, эти тесты должны сделать трюк.