Anzeige:
Ergebnis 1 bis 4 von 4

Thema: Perl: Problem mit Leerzeichen

  1. #1
    ivolein
    Gast

    Perl: Problem mit Leerzeichen

    Hallo Zusammen,

    ich habe ein Problem mit einem Perl-Programm, dass unter Windows läuft aber unter UNIX Probleme macht.

    Ich lese eine Datei Zeilenweise ein und wenn eine leere Zeile kommt, soll etwas gemacht werden. Unter Dos klappt es auch nur unter Linux habe ich da noch Probleme - die Leerzeile wird anhand dem RegEx "" erkannt.

    Hier ein kl. Code-Schnippsel:
    PHP-Code:
    while ( <DATEI> ) 
    {
         
    # Zeichen für Zeilenende abschneiden
         
    chomp;    
         
    # Leerzeile
         
    if ( /^$/ )
         { 
            
    # mach was (Block1)
            
    next;
          }
             
    # keine Leerzeile, mach was anderes  (Block2)    
         
    next

    Unter DOS werden die beiden Blöcke aufgerufen unter UNIX nur der zweite.
    Bei der Datei handelt es sich um eine per Windows erstellte Datei.
    Vielen Dank schon mal für die Hilfe.

    Gruß,

    Michael

  2. #2
    Registrierter Benutzer
    Registriert seit
    14.01.2002
    Beiträge
    657
    windows verwendet als zeilenumbruch \r\n während unix (linux) nur \n verwendet.

    $ matcht unter linux einem \n (od stringende) unter windows scheinbar \r\n oder stringende

    als workaround kannst du /^\r?$/ verwenden oder direkt nach dem while mit chomp;chomp; (2mal!) das \r und das \n entfernen

  3. #3
    boelwerkr
    Gast
    Code:
    chomp
    entfernt am Ende einer Zeile was in "$/", also in "$INPUT_LINE_SEPERATOR" drin steht. Ein zweimaliges ausführen bringt nichts.

    Entweder man verändert die Zeichenfolge in "$/" z.B:
    Code:
    local $/="\x0D\x0A";
    oder man entfernt das Windowszeilenende mit einem regulären Ausdruck:

    Code:
    while ( <DATEI> ) 
    {
         # Zeichen für Zeilenende abschneiden
         s/\x0D?\x0A//;
    
         # Leerzeile
         if ( /^$/ )
         { 
            # mach was (Block1)
            next;
          }
         # keine Leerzeile, mach was anderes  (Block2)    
    
         # hier ist ein "next" unnötig,
         # da der Schleifenblock sowieso schon zu Ende ist.,
         # und der nächste Durchlauf beginnt.
         # next; 
    }
    Wenn du dir nicht sicher bist ob die Datei immer Windows formatiert ist, dann würde ich den regulären Ausdruck nutzen, da er sowohl mit Windows als auch mit Unix formatieren Zeilen klar kommt.

    Nebenbei. Ich benutze "\x0D" anstatt "\r" und "\x0A" anstatt "\n" diese beiden Werte wurden in perl gesetzt, als perl für eine Plattform kompiliert wurde. Diese Werte müssen nicht immer so sein, wie man es erwartetet. So ist unter Windows "\n" gleich "\x0D\x0A" was einem "\r\n" unter Unix entsprechen würde. Wie man erkennt kann das durchaus zu Problemen führen. Aus dem Grund benutze ich die hexadezimale ASCII Darstellung, das gibt weniger Missverständnisse.

  4. #4
    ivolein
    Gast
    Super... Vielen Dank.

    Mit der Lösung hat es geklappt.

    Gruß,

    Michi

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •