如何在Windows上从ActivePerl输出带有unix行结尾的UTF-8编码XML文件?

时间:2010-04-30 11:59:47

标签: perl unix file winapi utf-8

我在WinXP上运行ActivePerl 5.8.8。我想输出一个带有UNIX行结尾的UTF-8 XML文件。

我已经查看了binmode的perldoc,但我不确定确切的语法(如果我没有咆哮错误的树)。以下不这样做(原谅我的Perl - 这是一个学习过程!):

sub SaveFile
{
    my($FileName, $Contents) = @_;

    my $File = "SAVE";
    unless( open($File, ">:utf-8 :unix", $FileName) )
    {
        die("Cannot open $FileName");
    }
    print $File @$Contents;

    close($File);
}

2 个答案:

答案 0 :(得分:3)

如果$ Contents尚未包含\n个字符,print将不会为您添加这些字符。你必须自己做。

还有一些其他问题可能会有问题;这是如何解决它们以及为什么。

IO Layers

要启用utf8输出,您需要使用:utf8,而不是:utf-8。此外,您的IO层中不应有空格,因此它应该看起来像“”>:utf8:unix“。

Open

open文件,您可以在线声明'my $ fh';无需将其初始化为字符串即可启动。没关系,这是一个很好的做法。此外,使用or是捕获打开错误的首选方法。

改变了,你的代码现在看起来像这样:

sub SaveFile
{
    my($FileName, $Contents) = @_;

    open my $File, ">:utf8:unix", $FileName
        or die "Cannot open $FileName";
    print $File map { "$_\n" } @$Contents;

    close($File);
}

map允许您通过在打印它们之前将换行符添加到每行来转换输入数组,并按顺序执行。

祝你好运!

答案 1 :(得分:1)

我认为你需要这样的东西。

use strict;
use warnings;

sub save_file {
    my ($file_name, $content) = @_;
    open my $fh, ">", $file_name or die $!;
    binmode $fh, ':utf8 :unix';
    print $fh @$content;
    close $fh;
}

# For example.
save_file('foo.txt', [ map "$_\n", qw(foo bar baz)]);

对于open的3参数形式的典型使用,您希望在调用open之前未定义文件句柄变量。有关详细信息,请参阅the docs