Очевидно, что если мы только что обработали последнюю строку одного файла, вызов 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

Ответы на вопрос(4)

Ваш ответ на вопрос