2012-07-09 21 views
8

Tengo un archivo que usa CR/LF para separar registros, pero los registros individuales a veces contienen un LF.Perl Nuevo problema de separador de línea

while (<$in>) 
{ 
    #extract record data 
} 

estoy tratando de leer este código como antes y esto (lo que cabe esperar) divide los registros que contienen sólo un LF. Sin embargo, hubiera esperado que un $/ reasignado resolviera este problema, pero parece que hace que el archivo completo se lea en una iteración.

$/ = "\r\n"; 
while (<$in>) 
{ 
    #extract record data 
} 

¿Alguien aquí puede sugerir una solución de trabajo?

Estoy usando Activestate Perl en Windows.

Respuesta

3

probar esto antes, mientras

binmode($in); 
4

Pruebe la configuración $/ en "\n". De Newlines in perlport:

Perl utiliza \n para representar la nueva línea "lógico", donde lo que es lógico puede depender de la plataforma en uso. En MacPerl, \n siempre significa \015. En Perls DOSish, \n por lo general significa \012, pero al acceder a un archivo en modo "texto", Perl utiliza la capa :crlf que lo traduce a (o desde) \015\012, dependiendo de si se está leyendo o escribiendo.

10

En las ventanas, Perl convierte los finales de línea CRLF entrantes a LF solamente, haciendo una distinción entre CRLF y LF imposible mediante la lectura de los datos en forma de texto (perlport). Por lo tanto, usted tiene que leer los datos en modo binario usando binmode en su archivo de manejar:

binmode($in); 

Después de eso, se puede establecer el separador de registro de entrada a "\ 015 \ 012" y leer en sus registros como habitual:

$/ = "\015\012"; 
while (<$in>) { 
    ... 
} 

saluda, Matthias

PS: no tengo ninguna oportunidad de probar que a nivel local, por el momento, así que lamento si no funciona.

+0

¡Gracias que funcionó a la perfección! – Hans