Ein paar Korrekturen:
[quote=topeg,05.01.2007, 20:59]Allso "\cM" entspricht "\012" oder "\r" allso "Carriage-Return"
"\cP" entspräche "\015" oder "\n" allso "Linefeed"
[/quote]
Hier bist du wohl etwas mit Dezimal- und Oktaldarstellung durcheinander geraten.
"\cM" (Carriage Return) ist "\015" (oktal) oder chr(13) (dezimal) oder "\x0D" (hexadezimal) oder "\r".
"\cJ" (Line Feed) ist "\012" (oktal) oder chr(10) (dezimal) oder "\x0A" (hexadezimal).
"\n" ist die Perl-interne Darstellung für ein Newline. Es wird intern meist als "\012", als Line Feed, abgespeichert (außer beim alten MacPerl, wo es intern ein Carriage Return war).
QuoteEs gibt nun vier verschidene Arten von Zeilenumbrüchen;
"\r\n" - Wird von Windows benutzt (ebenso TOS, DOS, CPM)
"\r" - Auf älteren MacOS üblich
"\n\r" Amiga (Beos glabe ich auch)
"\n" Auf allen unixuiden Systemen benutzt.
Wenn man unter Windows eine DOS/Windows-Textdatei im Textmodus einliest oder schreibt, dann ist ein Zeilenumbruch in Perl ein "\n", auch wenn in der Datei die Folge "\015\012" steht!
Es findet eine automatische Konvertierung zwischen intern "\012" und extern "\015\012" statt. Unter unixoiden Systemen ist die interne und externe Darstellung ohnehin gleich. Wenn man also Dateien des "eigenen" Betriebssystems verarbeitet, macht Perl schon immer Das Richtige[tm].
Das Zeichen "\n" ist daher zwar
immer ein Perl-interner Zeilenumbruch, aber beim Parsen externer Daten mehrdeutig (abhängig von Betriebssystem und Text-/Binärmodus). Wenn man klar machen möchte, welcher Zeichencode gemeint ist (Carriage Return, Line Feed oder eine Kombination), sollte man eine eindeutige Schreibweise wie "\012" oder "\cJ" benutzen.
Aufpassen muss man, wenn man Dateien von fremden Betriebssystemen oder im Binärmodus verarbeitet.
QuoteNun ist es günstig alle verschidenen Umbrüche auf einen Nenner zu bringen:
$content =~ s/\012?\015|\015?\012/\n/gs;
Sofern man wirklich ein "\n" haben möchte (abhängig davon, was man mit
$content im Weiteren macht).