2010-07-02 11 views
6

Mam skrypt Perla, który zużywa plik XML w systemie Linux i czasami istnieją CRLF (Hex 0D0A, Dos nowe linie) w niektórych wartości węzła, które.Usuwanie CRLF (0D 0A) z łańcucha w Perlu

System, który tworzy plik XML, zapisuje go jako pojedynczą linię i wygląda na to, że od czasu do czasu decyduje, że jest to zbyt długa i zapisuje CRLF w jednym z elementów danych. Niestety nic nie mogę zrobić z systemem dostarczającym.

Po prostu muszę usunąć te z ciągu, zanim go przetworzę.

Próbowałem wszystkich rodzajów zastępowania wyrażeń regularnych za pomocą klas znaków perla, wartości szesnastkowych, wszelkiego rodzaju i nic nie działa.

Uruchomiłem nawet plik wejściowy przez dos2unix przed przetworzeniem i nadal nie mogę pozbyć się błędnych znaków.

Czy ktoś ma jakieś pomysły?

Wielkie dzięki,

Odpowiedz

13

Typowy, Po wywalczeniu przez około 2 godziny, ja go rozwiązać w ciągu 5 minut zadać pytanie ..

$output =~ s/[\x0A\x0D]//g; 

Wreszcie dostał.

+3

Efekt Rubberduck. To nigdy nie zawodzi! :) –

+3

Należy pamiętać, że usuwa to wszystkie wystąpienia znaków '\ r' i' \ n', a nie ciąg '\ r \ n' (wystarczy, że' \ r' lub '\ n' może być poprawnymi wartościami które potrzebujesz w innych miejscach) –

6
$output =~ tr/\x{d}\x{a}//d; 

Są to zarówno znaki odstępu, więc jeśli terminatory są zawsze na końcu, można kliknąć prawym wykończenia z

$output =~ s/\s+\z//; 
+0

tr /// jest szybszy niż regex tutaj ... – dawg

+0

Brilliant. Eliminowanie białej przestrzeni !!! – downeyt

1

kilka możliwości:
1. Wymień wszystkie wystąpienia Cr/LF LF: $output =~ s/\r\n/\n/g; #instead of \r\n might want to use \012\015
2. Usuń wszystkie spacje końcowe: output =~ s/\s+$//g;
3. Slurp i dzielone: ​​

#!/usr/bin/perl -w 

use strict; 
use LWP::Simple; 

    sub main{ 
     createfile(); 
     outputfile(); 
    } 

    main(); 

    sub createfile{ 
     (my $file = $0)=~ s/\.pl/\.txt/; 

     open my $fh, ">", $file; 
     print $fh "1\n2\r\n3\n4\r\n5"; 
     close $fh; 
    } 

    sub outputfile{ 
     (my $filei = $0)=~ s/\.pl/\.txt/; 
     (my $fileo = $0)=~ s/\.pl/out\.txt/; 

     open my $fin, "<", $filei; 
     local $/;        # slurp the file 
     my $text = <$fin>;      # store the text 
     my @text = split(/(?:\r\n|\n)/, $text); # split on dos or unix newlines 
     close $fin; 

     local $" = ", ";       # change array scalar separator 
     open my $fout, ">", $fileo; 
     print $fout "@text";      # should output numbers separated by comma space 
     close $fout; 
    } 
+0

+1 slurp, +1 split –

Powiązane problemy