我需要在文件中用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);
这似乎是正确的,但我需要确保文件不会受到任何编码损坏。请帮助我确定。
答案 0 :(得分:3)
这个答案不会让你确定,但我希望它可以提供帮助。
我没有看到你的脚本有任何问题(使用utf8和iso-8859-1测试没有问题)虽然似乎有关于File :: slurp正确处理编码的能力的讨论:{{3} }
在这个类似主题的答案中,由于更好的编码处理,作者建议使用File :: Slurper作为替代:http://blogs.perl.org/users/leon_timmermans/2015/08/fileslurp-is-broken-and-wrong.html
答案 1 :(得分:2)
不再建议使用File :: Slurp(see here)。
我建议使用Path::Tiny。它易于使用,适用于文件和目录,仅使用核心模块,并且具有专门针对uft8和raw的slurp / spew方法,因此您不应该对编码有问题。
用法:
use Path::Tiny;
my $Text = path($File)->slurp_raw;
$Text =~ s{http://}{//}gi;
path($File)->spew_raw($Text);
更新:有关spew的文档:
以原子方式将数据写入文件。该文件将写入同一目录中的临时文件,然后通过原始文件重命名。可选的哈希引用可用于传递选项。唯一的选择是binmode,它被传递给用于写入的句柄上的binmode()。
spew_raw就像是一个binmode:unix的快速,无缓冲的原始写入。
spew_utf8就像是一个binmode:unix:encoding(UTF-8)(或PerlIO :: utf8_strict)。如果安装了Unicode :: UTF8 0.58+,则将使用Unicode :: UTF8编码的数据进行原始喷射。