2012-05-24 61 views
3

自从我Perling过了几个月,但我完全陷入了为什么会发生这种情况......为什么Perl的chomp会影响我的打印输出?

我在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

你从哪里得到数据文件?它有可能有奇数行结尾字符? –

+2

这是Unix上的Windows文件的常见问题。请参阅前面的讨论:http://stackoverflow.com/questions/881779/neatest-way-to-remove-linebreaks-in-perl http://stackoverflow.com/questions/1836217/perl-or-something-else-m - 问题http://stackoverflow.com/questions/7534591/cr-vs-lf-perl-parsing – daxim

回答

9

您输入的行以CR LF结束。你只能移除LF。一个简单的解决方案是使用,而不是下面的chomp

s/\s+\z//; 

你也可以使用dos2unix命令行工具将它们传递给Perl之前将文件转换。

+0

杜!非常感谢。就是这样。 – user311121

1

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

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

然后可以写

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

之后,而不管文件的格式或源的,所述线的读将被与标准"\n"终止。

相关问题