为什么Perl的chomp会影响我的打印输出?

时间:2012-05-24 13:56:28

标签: perl chomp

自从我成为Perling以来已经过了几个月,但我完全不知道为什么会这样......

我在OSX上,如果重要的话。

我正在尝试转换像

这样的文件中的行
08/03/2011 01:00 PDT,1.11

进入像

这样的标准行
XXX, 20120803, 0100, KWH, 0.2809, A, YYY

由于我正在阅读文件,因此我希望在每行读入后chomp。但是,当我chomp时,我发现我的打印全部搞砸了。当我没有chomp时,打印很好(除了额外的换行符......)。这是怎么回事?

while(<SOURCE>) {
    chomp;
    my @tokens = split(' |,');     # @tokens now [08/03/2011, 01:00, PDT, 1.11]

    my $converted_date = convertDate($tokens[0]);
    my $converted_time = convertTime($tokens[1]);

print<<EOF;
$XXX, $converted_date, $converted_time, KWH, $tokens[3], A, YYY
EOF
}

在那里进行chomp调用时,输出全部混淆:

, A, YYY10803, 0100, KWH, 1.11

在那里没有chomp电话,它至少以正确的顺序打印,但是有了额外的新行:

XXX, 20110803, 0100, KWH, 1.11
, A, YYY

请注意,在chomp处,它就像在第一行“覆盖”换行符一样。我添加了$|=1; autoflush,但不知道还能做什么。

思考?并提前感谢....

2 个答案:

答案 0 :(得分:9)

输入行以CR LF结尾。你只是删除了LF。一个简单的解决方案是使用以下代替chomp

s/\s+\z//;

您还可以使用dos2unix命令行工具在将文件传递给Perl之前对其进行转换。

答案 1 :(得分:1)

问题是你有DOS行结尾,并且是在Perl的Unix版本上运行。

对此的一个解决方案是使用PerlIO::eol。您可能必须安装它,但程序中不需要use行。

然后你可以写

binmode ':raw:eol(LF)', $filehandle;

之后,无论文件的格式或来源如何,读取的行都将以标准"\n"终止。