【问题标题】:What is the Perl's IO::File equivalent to open($fh, ">:utf8",$path)?Perl 的 IO::File 等价于 open($fh, ">:utf8",$path) 是什么?
【发布时间】:2017-02-10 17:52:37
【问题描述】:

可以将 utf-8 编码的文件白化如下:

open my $fh,">:utf8","/some/path" or die $!;

如何使用 IO::File 获得相同的结果,最好是 1 行? 我得到了这个,但它是否也能做到这一点,是否可以只用 1 行完成?

my $fh_out = IO::File->new($target_file, 'w');
$fh_out->binmode(':utf8');

作为参考,脚本开始如下:

use 5.020;
use strict;
use warnings;
use utf8;
# code here

【问题讨论】:

  • IO::File 没用。 open($fh, ...) 还创建句柄祝福到 IO::File

标签: perl utf-8


【解决方案1】:

是的,你可以do it in one line

open 接受一个、两个或三个参数。一个参数,它只是内置open函数的一个前端。有两个或三个参数时,第一个参数是文件名,可以包含空格或其他特殊字符,第二个参数是打开模式,后面可选文件权限值。

[...]

如果给 IO::File::open 一个包含 : 字符的模式,它会将所有三个参数传递给三参数 open 运算符。

所以你只需这样做。

my $fh_out = IO::File->new('/some/path', '>:utf8');

它与您的第一行 open 相同,因为它通过了。

【讨论】:

    【解决方案2】:

    我建议尝试Path::Tiny。例如,打开并写出你的文件

    use Path::Tiny;
    
    path('/some/path')->spew_utf8(@data);
    

    来自文档,spew, spew_raw, spew_utf8

    以原子方式将数据写入文件。 [ ... ]
    spew_raw 就像 spew 的 binmode 为 :unix 用于快速、无缓冲的原始写入。

    spew_utf8 类似于 spewbinmode:unix:encoding(UTF-8) (或 PerlIO::utf8_strict )。如果安装了Unicode::UTF8 0.58+,则会对使用Unicode::UTF8 编码的数据进行原始喷射。

    该模块集成了许多用于处理文件和目录、路径和内容的工具。它通常是像上面这样的简单调用,还有方法链、递归目录迭代器、回调挂钩等。整个过程中都有错误处理,对边缘情况的处理一致而周到,flock 在输入/输出句柄上,它自己的小而有用的异常类...请参阅文档。

    【讨论】:

      【解决方案3】:

      编辑: 你也可以使用File::Slurp如果不鼓励使用

      例如

      use File::Slurp qw(write_file);
      
      write_file( 'filename', {binmode => ':utf8'}, $buffer ) ;
      

      write_file 的第一个参数是文件名。下一个论点是 一个可选的哈希引用,它包含可以修改的键/值 write_file 的行为。参数列表的其余部分是数据 写入文件。

      一些不使用的充分理由?

      【讨论】:

      • AFAIK,它或多或少是废弃的模块,有一些问题。
      • @jm666 是的,但即使被广泛使用
      • 我编辑了我的答案,所以谁来阅读它,希望会有用
      • 我读到 File::Slurper 现在是要走的路。但是,它仍然是 OT :)
      猜你喜欢
      • 2013-01-13
      • 2011-08-01
      • 1970-01-01
      • 2010-09-18
      • 1970-01-01
      • 2016-08-04
      • 2012-03-20
      • 2021-12-29
      • 1970-01-01
      相关资源
      最近更新 更多