Лучшее, что я придумал, это:
perl -pe "BEGIN { binmode $_, ':raw:encoding(UTF-16LE)' for *STDIN, *STDOUT }; s/b/c/g;" <infile.txt >outfile.txt
Но учтите, что мне пришлось использовать <infile.txt
вместо infile.txt
, чтобы файл находился на STDIN. Теоретически, прагма open должна управлять кодировкой, используемой волшебным ARGV
файловым дескриптором, но я не могу заставить его работать правильно в этом случае.
Разница между <infile.txt
и infile.txt
заключается в том, как и когда файлы открываются. При <infile.txt
файл подключается к стандартному вводу и открывается до запуска Perl. Когда вы binmode STDIN
в блоке BEGIN
, файл уже открыт, и вы можете изменить кодировку.
Когда вы используете infile.txt
, имя файла передается в качестве аргумента командной строки и помещается в массив @ARGV
. Когда выполняется блок BEGIN
, файл еще не открыт, поэтому вы не можете установить его кодировку. Теоретически, вы должны быть в состоянии сказать:
use open qw(:std IO :raw:encoding(UTF-16LE));
и волшебная обработка <ARGV>
применяет правильную кодировку. Но я не смог заставить это работать правильно в этом случае.