2011-11-10 90 views
6

我有代码循环通过文件中的行,并尝试打印出每行添加了开始和结尾的东西。Perl输出覆盖自己

但是,我得到这样的输出:“nominalte牛”。

基本上,行后的位(标称)覆盖了它的开始。我知道删除chomp和regex行会停止这种效果,但我需要它在一行中不带空格。我哪里错了?

while ($line = <INPUT>) { 

     chomp $line; 
     $line =~ s/ //g; 
     printf "\@attribute %s nominal\n", $line; 
} 
+3

“@ attribute”的元素是什么? – 2011-11-10 15:49:07

+1

对不起,错过了逃生字符,它的意思是明文(\ @att ...) – blitzen

回答

10

您的输入文件可能来自MS Windows,行结尾编码为CR-LF。您也可以只需s/\r//删除CR。

+1

太棒了!这正是出错的地方,我会记住将来:)(我在我的解决方案中使用了$ line =〜s/\ r // g)。干杯! – blitzen

6

您的变量中可能有\r。尝试使用\s

$line =~ s/\s//g; 

\s意义,请参见perlre

+0

我认为这样的答案应该是独立的。为什么不简单解释'\ s'的含义以及更多信息的链接? – Sparky

+0

为什么你会删除所有空白来摆脱'\ r'(回车)? '$ Line =〜s/\ r // g';也就是说,choroba的答案可能是反正的根源(同样的解决方案) –

+1

太棒了!这正是出错的地方,我会记住将来:)(我在我的解决方案中使用了$ line =〜s/\ r // g)。干杯! – blitzen