Я пытаюсь прочитать текстовый файл UTF8 и заменить все вхождения символов Юникода (градусы Цельсия) какой-либо другой строкой.
#!/usr/bin/env perl
use 5.030;
use warnings;
use utf8;
use Perl6::Slurp;
my $s= "Hello. This is 2.3℃ .";
$s =~ s/2.3/two-point-three /gms;
$s =~ s/\x{2103}/degrees celsius/gms;
print "STRING: '$s'\n";
my $fs= slurp("test.md");
$fs =~ s/2.3/two-point-three /gms;
$fs =~ s/\x{2103}/degrees celsius/gms;
print "FSYSTM: '$fs'";
и мой файл test.md читается так же, как строка.
Hello. This is 2.3℃ .
Почему вывод
STRING: 'Hello. This is two-point-three degrees celsius .'
FSYSTM: 'Hello. This is two-point-three ℃ .
Обратите внимание, что File::Slurper имеет более интуитивно понятный интерфейс.
Вы также можете обнаружить, что Path::Tiny является полезной альтернативой — среди прочего, у него есть метод slurp_utf8()
.
Вам необходимо указать кодировку файла при чтении файла, отличного от ascii, с помощью Perl6::Slurp
:
Для меня работает следующее:
my $fs= slurp('<:utf8', "test.md");
Это прочитает файл, а затем декодирует содержимое из UTF8 в Unicode, чтобы Perl мог работать с ним как с Unicode, дополнительную информацию см. в документации perluniintro и Perl6::Slurp.
Придирка: несмотря на то, что написано в СИНОПСИСЕ, вы, вероятно, хотите slurp('<:encoding(utf-8)', 'test.md');
. Разница в том, что последний фактически проверяет допустимую кодировку, тогда как первый предполагает utf-8 независимо от фактической кодировки файла.
Можете выложить куда-нибудь test.md, тогда попробуем воспроизвести. Файл может иметь особую кодировку