0

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);

这似乎是正确的,但我需要确保文件不会被损坏,无论它具有什么编码。请帮助我确定。

4

2 回答 2

3

这个答案不能让你确定,但我希望它可以提供帮助。

我看不出你的脚本有任何问题(用 utf8 ans iso-8859-1 测试没有问题)虽然似乎有关于 File::slurp 正确处理编码的能力的讨论:http://blogs.perl .org/users/leon_timmermans/2015/08/fileslurp-is-broken-and-wrong.html

在关于类似主题的这个答案中,由于更好的编码处理,作者推荐 File::Slurper 作为替代方案:https ://stackoverflow.com/a/206682/6193608

于 2016-12-08T16:01:43.653 回答
2

不再推荐使用 File::Slurp(见这里)。

我建议使用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 就像 spew 使用 :unix 的 binmode 进行快速、无缓冲的原始写入。

spew_utf8 就像 spew 的 binmode 为 :unix:encoding(UTF-8) (或 PerlIO::utf8_strict)。如果安装了 Unicode::UTF8 0.58+,将对使用 Unicode::UTF8 编码的数据进行原始喷射。

于 2016-12-08T17:43:01.007 回答