binmode (STDOUT, ": utf8"); и окончания Unix-строк в Strawberry Perl - PullRequest
0 голосов
/ 17 апреля 2019

С помощью Strawberry perl v5.28.1 в Windows 10 я пытаюсь добиться того же результата, что и в Linux, а именно получить кодированный в UTF8 файл с окончаниями строк Unix .

Вот мой Perl-скрипт:

#!perl -w

use strict;
use utf8;
use Encode qw(encode_utf8);
use Digest::MD5 qw(md5_hex);

binmode(STDIN, ":utf8");
binmode(STDOUT, ":utf8");

my %words;

while(<>) {
        # change yo to ye
        tr/ёЁ/еЕ/;

        # extract russian word and its optional explanation
        next unless /^([А-Я]{2,})\|?([А-Я ,-]*)/i;
        my ($word, $expl) = (uc $1, $2);

        if (length($word) <= 3) {
                print $word;
                # if explanation is missing, omit the pipe
                print (length($expl) > 3 ? "|$expl\x0A" : "\x0A");
        } else {
                # print the md5 hash and omit the pipe and explanation
                print md5_hex(encode_utf8('my secret' . $word)) . "\x0A";
        }
}

Вот мой входной файл:

ААК|Плоскодонное речное судно
ААРОНОВЕЦ|
ААРОНОВЩИНА|
ААТ|Драгоценный красный камень в Японии
АБА|Толстое и редкое белое сукно
АБАЖУР|
АБАЖУРОДЕРЖАТЕЛЬ|
АБАЗ|Грузинская серебряная монета
АБАЗА|

Вот как я его запускаю (я использую type вместо <, потому что у меня много входных файлов в моем реальном случае использования):

type input.txt | perl encode-words-ru.pl > output.txt

Независимо от того, что я пробую в приведенном выше исходном коде Perl, строки в output.txt заканчиваются на \ x0D \ x0A

Пожалуйста, помогите мне не дать Perl "помогать" мне!

1 Ответ

1 голос
/ 17 апреля 2019

Возможно, есть лучший способ, но вы могли бы сделать STDOUT дескриптор файла :raw и затем самостоятельно закодировать вывод.

binmode STDOUT;    # or  binmode STDOUT, ":raw";
...
print (length($expl) > 3 ? encode_utf8("|$expl\n") : "\n");   # $exp1 is already decoded
...
print md5_hex(encode_utf8('my secret' . $word)) . "\n";
...