Программа считывает и проверяет первые 2 байта данного файла, чтобы решить, следует ли возвращать строку «ASCII» или «UTF-16».
Вот более подробное описание:
Если файл не может быть открыт по какой-либо причине, он возвращает «ASCII».(Странно, но это то, что он делает.)
return "ASCII" if (!open ($fh,"<",$f));
Если файл открывается как дескриптор файла $fh
, read($fh, $b, 2)
первые 2 (8-битные) байта в переменной $b
.Возвращаемое значение read
, означающее количество фактически прочитанных байтов, сохраняется в переменной $n
, хотя оно никогда не используется последним.
my $b = "";
my $n = read ($fh,$b,2);
Дескриптор файла $fh
получаетбыть close
ed сразу после чтения.
close ($fh);
Если значение $b
точно равно "\ x {ff} \ x {fe}", возвращается "UTF-16".Хотя точнее было бы вернуть «UTF-16BE».\x{..}
- представление байтов шестнадцатеричным значением.Таким образом, в "\x{ff}\x{fe}"
есть два байта, а не 10 или 12.
return "UTF-16" if ($b eq "\x{ff}\x{fe}");
Наконец, если $b
не равно "\ x {ff} \ x {fe}", "ASCII"возвращается.
return "ASCII";