Rolf B: linefeed Überraschung

Beitrag lesen

Hallo pl,

von Perl und seinen spezifischen Problemen habe ich ja keine Ahnung. Aber bei dem, was hier diskutiert wird, habe ich doch die Stirn, sie zu runzeln.[1]

Windows hat ein Problem mit Textdateien und open(). Die Lösung ist ein sysopen() call mit dem Flag O_BINARY was IO::File importiert.

Windows? Oder Perl für Windows? Oder doch ein Layer-8 Problem? Wie mir ein Mönch verriet, wird Perl-intern das Zeilenende durch \n repräsentiert, und der :crlf Layer übersetzt unter Windows deshalb jedes \n beim Schreiben in \r\n. Aber wenn man dann einen String hat, der nicht den Perl-Konventionen entspricht (wie es bei beat der Fall ist, seine Zeilen sind \r\n terminiert), dann gibt's \r\r\n Gemüse. Weil der :crlf Layer von korrekten Perl-Zeilenumbrüchen ausgeht.

Der Fehler wäre daher in $cgi->param oder im Umgang damit zu suchen. Eine Zeile wird in Perl durch \n terminiert, d.h. beim Auslesen müsste sichergestellt werden, dass korrekte Zeilenterminatoren gesetzt werden. Wenn Perl dafür keine Automatik bereitstellt, muss man es an dieser Stelle von Hand tun. Es wurdert mich aber schon, dass Perl es nicht selbst tut. Bei der Ausgabe machen sie sich diese Mühe, und bei der Eingabe nicht? Merkwürdig. Das bringt mich zu der Überlegung, ob es Alternativen zu $cgi->param geben könnte, die hier geeigneter sind. Aber wie mir ein anderer Mönch predigte - das ist nicht so. Ich weiß nur nicht, ob ich ihm vertrauen kann, denn er sagte auch dass die Zeilenterminatoren vom Betriebssystem des Browsers abhängen - was laut Spec NICHT der Fall ist. Vielleicht liefert ein Alt-Mac noch \r als Zeilenterminator, d.h. die Logik müsste sein:

  1. Ersetze \r*\n durch \n (standardisiert Windows+Unix)
  2. Ersetzte \r durch \n (falls es ein Alt-Mac war)

Den vom Browser erhaltenen String einfach binär in eine Datei zu schreiben, ist jedenfalls FALSCH. Textdateien sind plattformabhängig. Perl möchte ein plattformneutrales Textdatei-API anbieten - was sinnvoll ist. Diese Schicht wird durch binäres Schreiben umgangen. Will man das Script mal eben so auf einen Unix-basierenden Server übertragen, dann hat man auf einmal unerwünschte Umbrüche im Text.

Rolf

--
sumpsi - posui - clusi

  1. Heinz Erhardt ↩︎