2012-07-09 2 views
8

Ho un file che utilizza CR/LF per separare i record, ma i singoli record a volte contengono un LF.Perl New Line separator issue

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

Sto cercando di leggere questo codice come sopra e questo (come ci si aspetta) Split i record che contengono solo un LF. Tuttavia, mi sarei aspettato che una nuova versione $/ risolva questo problema, ma sembra che il file completo venga letto da me in un'unica iterazione.

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

Chiunque qui può suggerire una soluzione di lavoro?

Sto usando Activestate Perl su Windows.

risposta

3

prova prima che il

binmode($in); 
4

Provare a impostare $/ a "\n". Da Newlines in perlport:

Perl utilizza \n per rappresentare la nuova riga "logico", dove ciò è logico può dipendere dalla piattaforma in uso. In MacPerl, \n indica sempre \015. In Perls DOSish, \n significa di solito \012, ma quando si accede a un file in modalità "testo", Perl utilizza lo strato :crlf che traduce a (o da) \015\012, a seconda se si sta leggendo o scrivendo.

10

Su Windows, Perl converte i fine linea CRLF entrata in LF solo, distinguendo tra CRLF e LF impossibile leggendo i dati come testo (perlport). Pertanto, è necessario leggere i dati in modalità binaria utilizzando binmode sul vostro file-handle:

binmode($in); 

Dopo di che, è possibile impostare il separatore di record in ingresso a "\ 015 \ 012" e lettura nei record come solito:

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

saluta, Matthias

PS: non ho possibilità di testare che a livello locale, in questo momento, quindi mi dispiace se non funziona.

+0

Grazie, ha funzionato perfettamente! – Hans