自从我成为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,但不知道还能做什么。
思考?并提前感谢....
答案 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"
终止。