2011-09-23 14 views
5

Tengo un script de Perl que analiza un archivo de texto y lo divide por línea en una matriz. Funciona bien cuando LF termina cada línea pero cuando terminan por CR mi script no se maneja correctamente. ¿Cómo puedo modificar esta línea para solucionar esteCR vs LF Perl sintáctico

my @allLines = split(/^/, $entireFile); 

edición: Mi archivo tiene una mezcla de líneas, ya sea con terminando LF o terminando CR sólo se derrumba todas las líneas cuando su terminando en CR

Respuesta

11

Perl puede manejar tanto CRLF y LF el fin de línea con la incorporada en el :crlfPerlIO capa:

open(my $in, '<:crlf', $filename); 

convertirá automáticamente las terminaciones de línea CRLF a LF, y dejará las terminaciones de líneas LF sin cambios. Pero los archivos de solo CR son extraños. Si sabe que el archivo usa solo CR, puede establecer $/ en "\r" y leerá línea por línea (pero no cambiará el CR a una LF).

Si tiene que tratar con archivos de terminaciones de línea desconocidas (o incluso terminaciones de línea mixtas en un único archivo), es posible que desee instalar el módulo PerlIO::eol. Entonces se puede decir:

open(my $in, '<:raw:eol(LF)', $filename); 

y éste se convertirá automáticamente CR, CRLF, o los finales de línea LF LF en al leer el archivo.

Otra opción es establecer $/ en undef, que leerá todo el archivo en un sorbo. Luego divídelo en /\r\n?|\n/. Pero eso supone que el archivo es lo suficientemente pequeño como para caber en la memoria.

+0

¿Es compatible con algo que '\ R' coincida? – tchrist

+0

@tchrist, ¿te refieres a PerlIO :: eol? Es XS, y no he examinado de cerca el código, pero creo que solo maneja terminaciones de línea CR, LF y CRLF, pero eso cubre todos los archivos que he visto. – cjm

0

Se dividirá automáticamente la entrada en líneas si lee con <>, pero necesita cambiar $/ a \r.

$/ es el "separador de registros de entrada". ver perldoc perlvar para más detalles.

No hay ninguna forma de cambiar lo que una expresión regular considera que es el final de línea, siempre es una nueva línea.

+0

Suponiendo que el archivo tiene terminaciones de línea en Windows, ¿no cambiaría $/to \ r \ n? No tengo una máquina con Windows encendida ahora, así que no puedo probarla. – Kenny

+1

@Kenny, en Windows, CRLF normalmente se convierte a LF en lectura, por lo que el $/= "\ n" predeterminado es aceptable, y establecerlo en \ r \ n causaría problemas. Es probable que se trate de un archivo de Windows que no sea Windows. – ikegami

1

probablemente puede manejar las diferentes finales de línea cuando se hace la split, por ejemplo:

my @allLines = split(/\r\n|\r|\n/, $entireFile); 
+3

\ R es útil para eso ahora.:) –

+0

Nice :) No sabía esto, gracias. –

5

Si ha mezclado finales de línea, puede normalizarlos, haciendo coincidir una línea generalizada de fin:

use v5.10; 

$entireFile =~ s/\R/\n/g; 

También puede abrir un gestor de archivo en una cadena y leer las líneas como si lo hiciera desde un archivo:

open my $fh, '<', \ $entireFile; 
my @lines = <$fh>; 
close $fh; 

Incluso puede abrir la cadena con el layers that cjm shows.

Cuestiones relacionadas