substr($linea,-2,2) devuelve los dos últimos caracteres. Si la línea es de tipo Unix, es claro que ese penúltimo carácter no será "0x0D".
Lo de que esté mezclado, es nuevo. En ese caso tenemos que ver línea a línea, pero solo para quitar el último carácter en el caso de que sea un "0x0D".
Using perl Syntax Highlighting
#!/usr/bin/perl
open FICHERO
, "<kk.txt";
while ( $linea = <FICHERO> ) {
chomp $linea;
chop $linea if substr($linea, -1
) eq chr(0x0D
);
# Procesarlo o verificarlo
print "$linea.\n";
}
close FICHERO
;
Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
Esta es la solución formal, porque, realmente, no es necesaria. Con una simple línea ( s/\r\n/\n/ ) es más que suficiente para hacer todo el trabajo: solo va a cambiar las líneas tipo DOS.
Pero esto implica que hay que modificar los programas que están en producción, para que admitan esos ficheros mutantes.
Como no puedes modificar los ficheros que te llegan, aún se pueden hacer otras dos cosas: crear ficheros nuevos a partir de los originales o usar el 'pipe' del Unix. Por ejemplo, con el siguiente filtro
Using bash Syntax Highlighting
cat fichero.txt
| perl -p -e 's/\r\n/\n/' | programa_principal
Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
podemos encadenar el fichero original, filtrarlo y meter el resultado en el programa que nos interesa. Esto, naturalmente, es para los casos en que los programas admitan la entrada de los ficheros desde la entrada estándar.
Pero si no lo admiten, habrá que modificar o crear algún programa que haga ese filtrado:
Using perl Syntax Highlighting
#!/usr/bin/perl
while ( <> ) {
chomp;
chop if substr($_, -1
) eq chr(0x0D
);
print "$_\n";
}
Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
O mejor esta otra (que hace lo mismo que la línea de comandos anterior):
Using perl Syntax Highlighting
#!/usr/bin/perl
while (<>) {
s/\r\n/\n/;
print;
}
Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4