2016-12-08 7 views
0

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

Выполняет ли следующая работа?

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

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

+0

Похоже, что у нас нет файлов UTF-16 или UTF-32. – porton

+1

В коде есть опечатка. Он не будет компилироваться с неправильным именем модуля. Пожалуйста, исправьте это. – simbabque

+0

Знаете ли вы кодировку каждого файла заранее? – simbabque

ответ

3

Этот ответ не сделает вас уверенным, хотя я надеюсь, что это поможет.

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

в ответ на подобную тему, автор рекомендует File :: Slurper в качестве альтернативы, из-за лучшей обработки кодирования: https://stackoverflow.com/a/206682/6193608

2

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

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

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

use Path::Tiny; 

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

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

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

Обновление: Из документации по изрыгать:

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

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^