2011-11-10 8 views
6

Tengo un código que recorre las líneas de un archivo e intenta imprimir cada línea con algo agregado al principio y al final.La salida Perl se sobrescribe a sí misma

Sin embargo, obtengo una salida como esta: "vacas nominalte".

Básicamente, el bit después de la línea (nominal) sobrescribe el inicio de la misma. Sé que eliminar las líneas chomp y regex detiene este efecto, pero necesito que esté en una línea sin espacios. ¿Dónde estoy equivocado?

while ($line = <INPUT>) { 

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

¿Cuáles son los elementos de '@ attribute'? –

+1

Lo siento, extrañé el escape char, estaba destinado a ser texto sin formato (\ @att ...) – blitzen

Respuesta

10

el archivo de entrada es probablemente de MS Windows con el fin de línea codificada como CR-LF. También puede simplemente s/\r// para eliminar el CR.

+1

¡Genial! Eso es exactamente lo que estaba pasando, lo recordaré en el futuro :) (Usé $ line = ~ s/\ r // g; en mi solución). ¡Aclamaciones! – blitzen

6

Puede tener \r en su variable. Trate de usar \s:

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

Ver perlre del sentido de la \s.

+0

Creo que las respuestas deberían ser autónomas. ¿Por qué no simplemente explicar el significado de '\ s' junto con el enlace para obtener más información? – Sparky

+0

¿por qué quitaría todos los espacios en blanco para deshacerse de '\ r' (retornos de carro)? '$ Line = ~ s/\ r // g'; Dicho esto, la respuesta de Choroba es probablemente la causa raíz de todos modos (misma solución) –

+1

¡Genial! Eso es exactamente lo que estaba pasando, lo recordaré en el futuro :) (Usé $ line = ~ s/\ r // g; en mi solución). ¡Aclamaciones! – blitzen

Cuestiones relacionadas