PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Perl: Problem mit Leerzeichen



ivolein
17-08-2010, 22:20
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:


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

msi
17-08-2010, 22:28
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

boelwerkr
18-08-2010, 09:15
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:

local $/="\x0D\x0A";
oder man entfernt das Windowszeilenende mit einem regulären Ausdruck:


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.

ivolein
18-08-2010, 16:53
Super... Vielen Dank.

Mit der Lösung hat es geklappt.

Gruß,

Michi