2011-11-10 7 views
6

Ho un codice che scorre le righe in un file e tenta di stampare ogni riga con qualcosa aggiunto all'inizio e alla fine.L'output Perl si sovrascrive da solo

Tuttavia, ottengo l'output in questo modo: "mucche nominalte".

Fondamentalmente, il bit dopo la linea (nominale) sovrascrive l'inizio di esso. So che rimuovere le linee chomp e regex blocca questo effetto, ma ho bisogno che sia su una riga senza spazi. Dove sto andando male?

while ($line = <INPUT>) { 

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

Quali sono gli elementi di '@ attribute'? –

+1

Scusa, ho saltato l'escape char, doveva essere in chiaro (\ @att ...) – blitzen

risposta

10

Il file di input è probabilmente da MS Windows con la fine della riga codificata come CR-LF. Puoi anche solo s/\r// rimuovere il CR.

+1

Great! Questo è esattamente ciò che è andato storto, lo ricorderò in futuro :) (Ho usato $ line = ~ s/\ r // g; nella mia soluzione). Saluti! – blitzen

6

Si può avere \r nella variabile. Provare a utilizzare \s:

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

Vedere perlre per il significato di \s.

+0

Penso che le risposte di SO dovrebbero essere autonome. Perché non spiegare semplicemente il significato di '\ s' insieme al link per maggiori informazioni? – Sparky

+0

perché dovresti eliminare tutti gli spazi bianchi per sbarazzarti di '\ r' (ritorni a capo)? '$ Line = ~ s/\ r // g'; Detto questo, la risposta di Choroba è probabilmente la causa principale comunque (stessa soluzione) –

+1

Grande! Questo è esattamente ciò che è andato storto, lo ricorderò in futuro :) (Ho usato $ line = ~ s/\ r // g; nella mia soluzione). Saluti! – blitzen

Problemi correlati