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

Encoding 使用File::Slurp进行可靠的Perl编码,encoding,perl,slurp,Encoding,Perl,Slurp,我需要将文件中出现的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); 这似乎是正确的,但我需要确保该文件不会被损坏,无论它有什么编码

我需要将文件中出现的
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);

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

这个答案不能让你确定,尽管我希望它能帮助你

我看不出您的脚本有任何问题(使用utf8 ans iso-8859-1测试,没有问题),尽管似乎有关于File::slurp正确处理编码能力的讨论:


在这个关于类似主题的回答中,作者推荐File::Slurper作为替代方案,因为它具有更好的编码处理能力:

这个回答不能确保您的答案,尽管我希望它能有所帮助

我看不出您的脚本有任何问题(使用utf8 ans iso-8859-1测试,没有问题),尽管似乎有关于File::slurp正确处理编码能力的讨论:


在这个关于类似主题的回答中,作者推荐File::Slurper作为替代方案,因为它具有更好的编码处理能力:

不再建议使用File::Slurp()

我建议使用。它易于使用,可与文件和目录一起使用,只使用核心模块,并且具有专门针对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,其binmode为:unix,用于快速、无缓冲的原始写入

spew_utf8类似于spew,其binmode为:unix:encoding(UTF-8)(或PerlIO::utf8_strict)。如果安装了Unicode::UTF8 0.58+,将对使用Unicode::UTF8编码的数据执行原始spew


不再建议使用File::Slurp()

我建议使用。它易于使用,可与文件和目录一起使用,只使用核心模块,并且具有专门针对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,其binmode为:unix,用于快速、无缓冲的原始写入

spew_utf8类似于spew,其binmode为:unix:encoding(UTF-8)(或PerlIO::utf8_strict)。如果安装了Unicode::UTF8 0.58+,将对使用Unicode::UTF8编码的数据执行原始spew


我们似乎没有UTF-16或UTF-32文件。您的代码中有一个输入错误。它不会用错误的模块名编译。请解决这个问题。您事先知道每个文件的编码吗?我认为简单的
perl-pi-e的{http://}{/}{/}gi'
应该足够了。我添加了binmode=>':raw'。现在看来是正确的,我们似乎没有UTF-16或UTF-32文件,您的代码中有一个输入错误。它不会用错误的模块名编译。请解决这个问题。您事先知道每个文件的编码吗?我认为简单的
perl-pi-e的{http://}{/}{/}gi'
应该足够了。我添加了binmode=>':raw'。现在看来是对的