Jul 092010
 

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 ;)

  4 Responses to “Perl, Windows, Unix und Zeilenumbrüche”

  1. Hmm, die meisten Editoren unter Win haben doch die moeglichkeit, Unix-Like Newlines zu verwenden? Damit erledigt sich doch das Problem?

  2. Wär sicher ne Möglichkeit, nur werden die Daten nicht per Hand erzeugt, sondern per Script :/

    Die Daten, die das Script unter Unix verarbeitet, werden durch ein Script unter Windows erzeugt. Das ist meiner Vermutung nach momentan der Punkt, an dem die Windows-artigen Zeilenumbrüche ins Spiel kommen.

    Vielleicht habe ich in den nächsten Wochen mal ein bisschen Zeit übrig, damit ich mir das erzeugende Script anschauen kann. Würde gerne die Ursache beseitigen und nicht nur die Symptome ;)

  3. Kannst Du vielleicht schon bei dem Tool, das die Daten erzeugt, eingreifen?

    Noch ein Debugging-Tipp: Wenn Du den Inhalt von Variablen anschauen willst, nimmst Du am Besten das Modul Data::Dumper. Mit der Variablen “Useqq” kannst Du einstellen, ob auch Steuerzeichen mit ausgegeben werden:

    jars@jars-desktop:~$ perl
    use strict;
    use warnings;

    use Data::Dumper;

    my $var = “test\r”;

    $Data::Dumper::Useqq = 1;
    print Dumper $var;
    $Data::Dumper::Useqq = 0; # so ist es per default
    print Dumper $var;

    ^D
    $VAR1 = “test\r”;
    ‘;AR1 = ‘test

  4. Ich denke auch, dass der beste Ansatz ist das produzierende Tool zu ändern, weil ich damit die Ursache und nicht das Problem bekämpfe.

    Data::Dumper kannte ich nicht, zum Debuggen in Perl habe ich meist den eingebauten Debugger mittels perl -d aufgerufen. Die Möglichkeit von Data::Dumper auch Steuerzeichen anzeigen zu lassen ist toll, danke für den Hinweis!

 Leave a Reply

(required)

(required)

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>