Надежная кодировка 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.