2012-05-24 133 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"終止。