可以将utf-8编码的文件白化如下:
open my $fh,">:utf8","/some/path" or die $!;
如何使用IO :: File获得相同的结果,最好是一行? 我得到了这个,但是它做了同样的事情,它可以在一行中完成吗?
my $fh_out = IO::File->new($target_file, 'w');
$fh_out->binmode(':utf8');
作为参考,脚本如下所示:
use 5.020;
use strict;
use warnings;
use utf8;
# code here
答案 0 :(得分:4)
我建议试试Path::Tiny。例如,打开并写出您的文件
use Path::Tiny;
path('/some/path')->spew_utf8(@data);
来自文档,spew, spew_raw, spew_utf8
以原子方式将数据写入文件。 [...]
spew_raw
类似于spew
,其binmode为:unix
,用于快速,无缓冲的原始写入。
spew_utf8
与spew
类似binmode
:unix:encoding(UTF-8)
(或PerlIO::utf8_strict)。如果安装了Unicode::UTF8 0.58+,则会对使用Unicode::UTF8
编码的数据执行原始支出。
该模块集成了许多用于处理文件和目录,路径和内容的工具。它通常是简单的调用,如上面的,但也有方法链接,递归目录迭代器,回调挂钩等。整个,一致和周到处理边缘情况的错误处理,输入/输出句柄上的flock
,它自己的异常的小而有用的类...参见文档。
答案 1 :(得分:3)
是的,你可以do it in one line。
open接受一个,两个或三个参数。使用一个参数,它只是内置打开功能的前端。使用两个或三个参数时,第一个参数是可以包含空格或其他特殊字符的文件名,第二个参数是打开模式,可选地后跟文件权限值。
[...]
如果给IO :: File :: open一个包含:字符的模式,它会将所有三个参数传递给三参数open运算符。
所以你就这样做了。
my $fh_out = IO::File->new('/some/path', '>:utf8');
它与您的第一个open
行相同,因为它会被传递。
答案 2 :(得分:-1)
修改强> 如果不鼓励使用
,您也可以使用File::Slurpe.g
use File::Slurp qw(write_file);
write_file( 'filename', {binmode => ':utf8'}, $buffer ) ;
write_file的第一个参数是文件名。下一个论点是 一个可选的哈希引用,它包含可以修改的键/值 write_file的行为。参数列表的其余部分是数据 写入文件。
不使用的一些好理由?
有一些bugs
正如@ThisSuitIsBlackNot所说File::Slurp is broken and wrong