Очевидно, что если мы только что обработали последнюю строку одного файла, вызов eof () (с паренами) открывает следующий файл (если он есть), делает * ARGV допустимым (если он может) и проверяет конец файла на этом следующем файле. Если этот следующий файл присутствует и не находится в конце файла, тогда мы можем безопасно использовать binmode на ARGV.
у прочитать ввод UTF-8 в Perl, независимо от того, поступает ли он из стандартного ввода или из файла, используя оператор diamond:while(<>){...}
.
Таким образом, мой скрипт должен вызываться двумя способами, как обычно, с одинаковым выводом:
./script.pl utf8.txt
cat utf8.txt | ./script.pl
Но выходы отличаются! Только второй звонок (используяcat
Кажется, работает как задумано, правильно читая UTF-8. Вот сценарий:
#!/usr/bin/perl -w
binmode STDIN, ':utf8';
binmode STDOUT, ':utf8';
while(<>){
my @chars = split //, $_;
print "$_\n" foreach(@chars);
}
Как я могу заставить его правильно читать UTF-8 в обоих случаях? Я хотел бы продолжать использовать алмазный оператор<>
для чтения, если это возможно.
РЕДАКТИРОВАТЬ:
Я понял, что должен описать разные результаты. Мой входной файл содержит эту последовательность:a\xCA\xA7b
, Метод сcat
правильно выводит:
a
\xCA\xA7
b
Но другой метод дает мне это:
a
\xC3\x8A
\xC2\xA7
b