2011-11-10 7 views
6

ファイル内の行をループするコードがあり、開始時と終了時に何かを追加して各行を出力しようとします。Perlの出力自体が上書きされる

しかし、「nominalte cows」のように出力されます。

基本的に、ライン(名目)の後のビットは、その先頭を上書きします。私はchompとregexの行を削除するとこの効果は止まることがわかりますが、スペースなしで1行にする必要があります。どこが間違っていますか?

while ($line = <INPUT>) { 

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

'@ attribute'の要素は何ですか? –

+1

申し訳ありませんが、エスケープ文字を逃した、それは平文(\ @att ...)であることを意味しました – blitzen

答えて

10

あなたの入力ファイルはおそらくCR-LFとしてエンコードされた行末を持つMS Windowsからのものです。また、CRを削除するにはs/\r//することもできます。

+1

素晴らしい!それはまさに間違っていたことです、私はそれを覚えています:)(私は$ line =〜s/\ r // g;私の解決策で使った)。乾杯! – blitzen

6

変数に\rが含まれている可能性があります。 \sを使用してみてください:

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

\sの意味についてperlreを参照してください。

+0

私はSO答えが自己完結型であるべきだと思います。もっと情報のためのリンクと共に単に '\ s'の意味を説明するのはなぜですか? – Sparky

+0

なぜ\\(キャリッジリターン)を取り除くためにすべての空白を取り除くのですか? '$ Line =〜s/\ r // g';つまり、チョロバの答えはおそらく根本的な原因です(同じ解決策) –

+1

素晴らしい!それはまさに間違っていたことです、私はそれを覚えています:)(私は$ line =〜s/\ r // g;私の解決策で使った)。乾杯! – blitzen

関連する問題