2016-12-08 16 views
0

http://のすべてのオカレンスをファイル内の//に置き換える必要があります。ファイルは、少なくともUTF-8CP1251、またはCP1255である可能性があります。File :: Slurpで信頼できるPerlエンコーディング

以下は機能しますか?

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 ANSのISO-8859-1でテスト)スクリプトに問題が表示されていない::正しくエンコーディングを処理するために読ま:http://blogs.perl.org/users/leon_timmermans/2015/08/fileslurp-is-broken-and-wrong.html

同様のテーマに関するこの回答で

、著者が代替としてファイル:: Slurperを推奨しています、原因より良いエンコードの取り扱い:https://stackoverflow.com/a/206682/6193608

2

もはやファイルを使用することをお勧めします::吸い込み(see here)。

Path::Tinyをお勧めします。使い方は簡単で、ファイルとディレクトリの両方で動作し、コアモジュールのみを使用し、uft8とrawのためのスラップ/スプライトメソッドを備えているので、エンコーディングに問題はないはずです。

使用法:

use Path::Tiny; 

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

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

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

を更新:スピューのドキュメントから

アトミックファイルにデータを書き込みます。ファイルは同じディレクトリの一時ファイルに書き込まれ、元のファイルに名前が変更されます。オプションのハッシュリファレンスを使用してオプションを渡すことができます。唯一のオプションはbinmodeで、これは書き込みに使用されるハンドルのbinmode()に渡されます。

spew_rawは、高速、バッファリングされていない生の書き込みのためのbinmode:unixのようなものです。

spew_utf8は、unix:encoding(UTF-8)(またはPerlIO :: utf8_strict)のbinmodeを持つようになります。 Unicode :: UTF8 0.58+がインストールされている場合は、代わりにUnicode :: UTF8でエンコードされたデータに対してrawスプールが実行されます。

関連する問題