使用File :: Slurp进行可靠的Perl编码

时间:2016-12-08 10:41:28

标签: perl encoding perl5 slurp

我需要在文件中用http://替换//的每一次出现。该文件可能(至少)位于UTF-8CP1251CP1255

以下是否有效?

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

这似乎是正确的,但我需要确保文件不会受到任何编码损坏。请帮助我确定。

2 个答案:

答案 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编码的数据进行原始喷射。