Надежная кодировка Perl с помощью File::Slurp

Мне нужно заменить каждый случай http:// с // в файле. Файл может быть (по крайней мере) в UTF-8, CP1251, или же CP1255,

Работает ли следующее?

use File::Slurp;
my $Text = read_file($File, binmode=>':raw');
$Text =~ s{http://}{//}gi;
write_file($File, {atomic=>1, binmode=>':raw'}, $Text);

Это кажется правильным, но я должен быть уверен, что файл не будет поврежден, какой бы кодировкой он ни был. Пожалуйста, помогите мне быть уверенным.

2 ответа

Этот ответ не убедит вас, хотя я надеюсь, что он может помочь.

Я не вижу проблем с вашим сценарием (без проблем протестирован с utf8 и iso-8859-1), хотя, похоже, обсуждается способность File::slurp правильно обрабатывать кодировку: http://blogs.perl.org/users/leon_timmermans/2015/08/fileslurp-is-broken-and-wrong.html

В этом ответе на похожую тему автор рекомендует File::Slurper в качестве альтернативы из-за лучшей обработки кодировки: /questions/1988860/kakov-nailuchshij-sposob-pomestit-fajl-v-stroku-v-perl/1988877#1988877

Больше не рекомендуется использовать File::Slurp ( см. Здесь).

Я бы порекомендовал использовать Path:: Tiny. Он прост в использовании, работает как с файлами, так и с каталогами, использует только основные модули и имеет методы slurp/spew специально для uft8 и raw, поэтому у вас не должно быть проблем с кодировкой.

Использование:

use Path::Tiny;

my $Text = path($File)->slurp_raw;

$Text =~ s{http://}{//}gi;

path($File)->spew_raw($Text);

Обновление: из документации на spew:

Записывает данные в файл атомарно. Файл записывается во временный файл в том же каталоге, а затем переименовывается поверх оригинала. Для передачи опций может использоваться дополнительная ссылка на хеш. Единственная опция - binmode, которая передается в binmode() на дескрипторе, используемом для записи.

spew_raw похож на spew с binmode из: unix для быстрой, небуферизованной, сырой записи.

spew_utf8 похож на spew с бинмодом:unix:encoding(UTF-8) (или PerlIO::utf8_strict). Если установлен Unicode::UTF8 0.58+, вместо данных будет выполняться необработанный выброс данных, закодированных с помощью Unicode::UTF8.

Другие вопросы по тегам