我在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);
}
答案 0 :(得分:3)
如果$ Contents尚未包含\n
个字符,print
将不会为您添加这些字符。你必须自己做。
还有一些其他问题可能会有问题;这是如何解决它们以及为什么。
要启用utf8输出,您需要使用:utf8
,而不是:utf-8
。此外,您的IO层中不应有空格,因此它应该看起来像“”>:utf8:unix“。
要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。