2012-07-09 14 views
8

Mam plik, który używa CR/LF do oddzielania rekordów, ale poszczególne rekordy zawierają czasami LF.Problem z separatorem nowej linii Perla

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

Próbuję odczytać kodu jak wyżej, a to (jak bym się spodziewał) rozdziela rekordy, które zawierają tylko LF. Jednak oczekiwałbym, że ponownie przydzielony $/ rozwiąże ten problem, ale wydaje się, że spowoduje, że cały plik zostanie odczytany w jednej iteracji.

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

Ktoś tutaj może zaproponować działające rozwiązanie?

Używam Perl Activestate w systemie Windows.

Odpowiedz

3

spróbować tego przed, podczas

binmode($in); 
4

Spróbuj ustawić $/ na "\n". Od Newlines in perlport:

Perl używa \n do reprezentowania „logiczne” przełamane, gdzie co jest logiczne może zależeć od używanej platformy. W MacPerl, \n zawsze oznacza \015. W perls DOSish, \n oznacza zwykle \012, ale przy dostępie do pliku w trybie „tekst”, Perl używa warstwy :crlf że przekłada ją do (lub z) \015\012, w zależności od tego, czy czytasz lub pisanie.

10

Na oknach, Perl przetwarza przychodzące końca linii CRLF tylko do LF, dokonując rozróżnienia między CRLF i LF niemożliwej czytając w danych w postaci tekstu (perlport). Dlatego trzeba czytać dane w trybie binarnym za pomocą binmode na plik uchwytem:

binmode($in); 

Po tym, można ustawić separator rekordu wejściowego do „\ 015 \ 012” i przeczytać w dokumentacji jak zwykle:

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

Greets Matthias

PS: nie mam okazję przetestować że lokalnie, w tej chwili, więc żałuję, jeśli to nie działa.

+0

Dzięki temu działało idealnie! – Hans