Stefan: Zeilenende UNIX/DOS

Hallo,
ich schreibe (unter Windows) ein Perl-CGI, welches unter Unix laufen soll. Ich schreibe eine Datei, die auf UNIX mit CRLF enden muss. (Ich weiss, ist komisch, aber "jemand" will das so...)

  1. print "Text\015\012";
    schreibt Zeilen mit Zeilenende 0D0D0A (DOS)

  2. print "Text$CRLF";
    (unter Verwendung von "use Socket")
    schreibt Zeilen mit Zeilenende 0D0D0A (DOS)

  3. print "Text\n";
    schreibt Zeilen mit Zeilenende 0D0A (DOS) aber leider nur 0A (UNIX)

Was muss ich machen, um auf beiden Systemen 0D0A zu erhalten?

Danke fuer Eure Hilfe,
Stefan

  1. Moin Moin !

    open FILE,">output.file" or die $!;
    binmode FILE;
    print FILE "Zeile 1 und \015\012Zeile 2, beide mit Oktal-Angaben.\015\012";
    print FILE "Zeile 3 und \r\nZeile 4, beide mit Escapes (etwas unsauber, aber so lange es bei Unix und Windows bleibt, korrekt).\r\n";
    close FILE;

    Alexander

    1. Hallo Alexander,
      heisst das ich muss das im binmode machen, obwohl es eigentlich ein Textfile ist?
      Stefan

      1. Moin Moin !

        heisst das ich muss das im binmode machen, obwohl es eigentlich ein Textfile ist?

        Wenn Du darauf bestehst, ein u.U. OS-fremdes Zeilenende zu haben: Ja.

        Du kannst Dir vielleicht das Leben wesentlich leichter machen, wenn Du zum Transfer der Text-Dateien FTP im ASCII-Mode (im Gegensatz zum Binär-Mode) benutzt, dann werden die Zeilenenden beim Transfer automatisch an das jeweilige OS angepaßt.

        Diese ganze Unterscheidung zwischen Textmode und Binärmode bei Dateien ist sowieso nur eine Spielerei der C-Runtime-Library (libc), der Betriebssystemkern arbeitet immer binär (zumindest bei Unixen aller Art, DOS und Windows).

        Im Prinzip ist die libc auf Nicht-Unix-Betriebssystemen eine (sehr dünne) Emulation von Unix. Unter Unix ist das Zeilenende einer Textdatei LF ("\n"), und wenn der selbe Quelltext auch auf Nicht-Unix-Systemen ohne Änderungen laufen soll, muß eben die libc die Zeilenenden anpassen, d.h. beim Schreiben wird aus LF CR/LF unter DOS und Windows und CR auf dem Mac, und beim Lesen wird aus CR/LF unter DOS bzw CR auf dem Mac wieder ein LF ("\n"). Weil mit diesem "hochintelligenten" Algorithmus aber sämtliche Binärdateien auf Nicht-Unix-Systemen geschreddert würden, ist irgendjemand auf die Idee gekommen, zwischen Textmode und Binärmode umzuschalten.

        Beschwerden bitte an Microsoft und Digital wegen der DOS- und CP/M-Zeilenenden und an Apple wegen der Mac-Zeilenenden; sowie an K&R, die uns den ganzen Ärger mit C eingebrockt haben. ;-)

        Alexander