Perl, Windows, Unix und Zeilenumbrüche

2010-07-09 14:37

Gelegentlich entwickle ich unter Windows Perl-Scripts, die später auf einem Unix-Server ausgeführt werden. Problematisch kann es dabei werden, wenn die Daten, welche das Script entgegen nimmt, unter Windows generiert werden.

Hier kann dann das Newline-Problem auftreten. Windows nutzt zur Darstellung eines Zeilenumbruchs die Zeichenfolge eines Carriage Return + Line Feed, Linux nutzt hingegen nur einen einfachen Line Feed. Das zusätzliche CR sorgt dann für Probleme bei der Verarbeitung.

Hat man unter Unix Zugriff auf die Daten, welche das Script verarbeiten soll, so kann man sich den Inhalt mit vi anzeigen lassen. Das CR wird dort durch ein ^M dargestellt. Beim Debuggen mit Perl wird das Zeichen nicht angezeigt, weil es ein Steuerzeichen ist. Aber wie geht man damit um?

Um dagegen gefeit zu sein kann man den Befehl dos2ux bzw. dos2unix benutzen. Der sollte bei der jeweiligen Unix-Distribution mitgeliefert werden. Ist dann natürlich einiges an Mehraufwand, wenn man jedes Mal erst das Programm zur Umwandlung aufrufen muss.

Oder man verwendet einfach innerhalb des Perl-Scripts Regular Expressions um dieses Zeichen durch ein entsprechendes Newline-Zeichen zu ersetzen.

$someWindowsString =~ s/\015\012/\n/g;

Hoffentlich behalte ich das beim nächsten Mal in Erinnerung, bevor ich wieder viel zu lange nach unsichtbaren Zeichen suche ;)