Доброго времени суток!
У меня есть скрипт на Perl, который должен выравнивать строки и записывать их в файл, в UTF8. Для этого использую sprintf.
Часть скрипта представлена ниже:
#!/usr/bin/perl
use strict;
use utf8;
use locale;
use warnings;
...
my $length_sv = 9;
open my $out, '>>:encoding(UTF-8)', "filename" or warn "Could not open file - $!" and exit(1);
my ($tid, $cid, $v3, $l, $v5, $sub) = $_ =~ /^\{"id":(\d+),"customer_id":(\d+)(.*?)_login":"(\w{1,10})"(.*?)"subject":"(.*?)"/;
my $subc = substr($sub, 0, $length_sv);
say $subc;
my $string = sprintf "| %-5s | %-1s | %-9s | %-${length_sv}s | %-11s | %-10s|","$time","$num","$tid","$subc","$cid","$l";
say $string;
say $out $string;
close $out;
После запуска скрипта в STDOUT получаю правильный вывод, такой, как должен записаться в файл:
Тест Mark
| 11:00 | 1 | 1234567 | Тест Mark | 10101012 | login |
Но в файл запись происходит с ошибкой (в столбце с кириллицей):
$ cat filename
| 11:00 | 1 | 1234567 | ТеÑÑ Mark | 10101012 | login |
В файл должен записаться столбец Тест Mark
, но этого не происходит, при этом та же самая строка в STDOUT с помощью say
или printf
выводится корректно.
Я пробовал добавлять:
binmode($out,':utf8');
К сожалению, это не помогло. Я не совсем понимаю, из-за чего это происходит, ведь при записи в $out
указывается явно кодировка UTF-8
.
Подскажите, пожалуйста, можно как-то исправить это?