Luis: misteriöses Leerzeichen am Zeilenanfang

Hallo  Spezialisten,

warum schreibt mir denn dieses kl. Programm bei jedem Aufruf immer in Leerzeichen am Anfang der Zeile (Ab der 2ten Zeile/Datensatz)??

open(LISTE,"$mitglieder_file");
@mitglieder=<LISTE>;
close(LISTE);

$datensatz = $FORM{'datensatz'};
$datensatz=~ s/#Komma#/&#044;/g;

push (@mitglieder,$datensatz);
@mitglieder2 = sort (@mitglieder);

open(LISTE,">$mitglieder_file");
print LISTE "@mitglieder2\n";
close(LISTE);

Danke für ev. Antworten!

Luis

  1. Hallo  Spezialisten,

    warum schreibt mir denn dieses kl. Programm bei jedem Aufruf immer in Leerzeichen am Anfang der Zeile (Ab der 2ten Zeile/Datensatz)??

    open(LISTE,"$mitglieder_file");
    @mitglieder=<LISTE>;
    close(LISTE);

    $datensatz = $FORM{'datensatz'};
    $datensatz=~ s/#Komma#/&#044;/g;

    push (@mitglieder,$datensatz);
    @mitglieder2 = sort (@mitglieder);

    open(LISTE,">$mitglieder_file");
    print LISTE "@mitglieder2\n";
    close(LISTE);

    Danke für ev. Antworten!

    Luis

    HI!
    Kann es sein dass in deiner ersten Datei die Zeilenumbrüche nicht mit {n generiert werden???
    versuch mal "\r" und "\t" aus deinen Zeilen herauszulöschen!

    Bye

    1. Ist ne ganz normale Textdatei auf dem Windows PC erzeugt
      (Zeilenumbruch mit "Enter")
      und mit ascii Modus zum Server übertragen.

      mfg Luis

      1. Hoi,

        Ist ne ganz normale Textdatei auf dem Windows PC erzeugt
        (Zeilenumbruch mit "Enter")
        und mit ascii Modus zum Server übertragen.

        erste frage: ist der Server ein Linux server?
        zweite frage: hast du die Datei mal runtergezogen, im _binary_ -Mode
        und mal mit nem Hex-Editor isnpiziert, ob das wirklich ein Leerzeichen ist?

        bye eddie

        1. hi,

          Hoi,

          ups ... das ist ein für Christian K. reservierter Gruß ;-)

          Ist ne ganz normale Textdatei auf dem Windows PC erzeugt
          (Zeilenumbruch mit "Enter")
          und mit ascii Modus zum Server übertragen.
          erste frage: ist der Server ein Linux server?

          Das ist hier noch absolut wurscht.

          zweite frage: hast du die Datei mal runtergezogen, im _binary_ -Mode
          und mal mit nem Hex-Editor isnpiziert

          na, nun mal langsam: er hat eine _reine_ ASCII-Textdatei selber erstellt und hochgeladen, warum soll er die nochmal runterziehen und so inspizieren, wie du das vorschlägst?

          Grüße aus Berlin

          Christoph S.

          1. Moin!

            zweite frage: hast du die Datei mal runtergezogen, im _binary_ -Mode
            und mal mit nem Hex-Editor isnpiziert
            na, nun mal langsam: er hat eine _reine_ ASCII-Textdatei selber erstellt und hochgeladen, warum soll er die nochmal runterziehen und so inspizieren, wie du das vorschlägst?

            Weil: Das Skript hat die Datei eingelesen, die Daten verarbeitet und neu in die Datei geschrieben. Um sicherzugehen, welche Daten in die Datei geschrieben wurden, muß man gucken, welche Daten in die Datei geschrieben wurden. Und das geht nur mit Download - und der binary-mode verhindert, daß die Zeilenumbrüche geändert werden, man hat hinterher wirklich eine 1:1-Kopie lokal verfügbar für die Fehleranalyse.

            - Sven Rautenberg

            1. tut mir leid, Sven,

              aber ich muß widersprechen:

              Weil: Das Skript hat die Datei eingelesen

              darum gehts gar nicht, sondern es geht um das "Script" selbst, und nicht um die eingelesene Datei. Was wir im Ausgangsposting zu sehen bekommen haben, ist ein Auszug aus einem PERL-Script, und die Frage geht  -  richtigerweise  -  darum, warum dieses Script ein Leerzeichen schreibt.

              Um sicherzugehen, welche Daten in die Datei geschrieben wurden

              In das Script selbst wurden mit großer Wahrscheinlichkeit keine "Daten" geschrieben. Mir ist keine Technologie bekannt, mit der ich ein _bestehendes_ PERL-Script auf dem Server per HTTP-Zugriff verändern könnte (andere Dateiformate sehr wohl, aber nicht im cgi-bin-Verzeichnis  -  falls das möglich ist, sollte schleunigst der Provider wegen Unfähigkeit zur Serververwaltung gewechselt werden).

              Hier gehts aber nicht darum, die "Auswirkung" zu analysieren (da hättest du recht), sondern darum, die "Ursache" zu finden, warum das Script in eine _andere_ Datei eben eine Leerstelle schreibt. Dazu haben wir aber wahrscheinlich nicht genug Scriptmaterial. Die Vermutung, die am Threadbeginn geäußert wurde, es könne mit einem nicht korrekten Umbruch ( \n ) zu tun haben, trifft das geschilderte Problem auch nicht.

              Ich glaube eher, daß es hier hängt:

              $datensatz = $FORM{'datensatz'};
              $datensatz=~ s/#Komma#/&#044;/g;

              Oder es ist im gesamten Script noch an anderer Stelle mit den RegExpressions was gebaut worden.

              muß man gucken, welche Daten in die Datei geschrieben wurden. Und das geht nur mit Download - und der binary-mode verhindert, daß die Zeilenumbrüche geändert werden, man hat hinterher wirklich eine 1:1-Kopie lokal verfügbar für die Fehleranalyse.

              völlig korrekt, wenn es um die "generierte" Datei geht, aber hier gehts darum eben nicht, sondern es geht um das "generierende" Script.

              Grüße aus Berlin

              Christoph S.

  2. Moin moin!

    open(LISTE,">$mitglieder_file");
    print LISTE "@mitglieder2\n";

    ^^^^^^^^^^^^^^^^
    Du laesst eine Liste innerhalb von Double quotes interpolieren, d.h. die einzelnen Elemente einzeln hinschreiben, jeweils getrennt von dem Zeichen, das in der vordefinierten Variable $" steht. Das ist normalerweise ein Leerzeichen. Damit ist die Zeile also aequivalent zu
    print LISTE "$mitglieder2[0] $mitglieder2[1] $mitglieder2[2] ... \n";
    Da Du oben beim Einlesen der Liste nicht chomp() verwendet hast, enthaelt jedes Element selbst an letzter Position noch einen Zeilenumbruch, der dann also direkt vor dem automatisch eingefuegten Leerzeichen landet. So beginnt dann also jede Zeile mit einem Leerzeichen.

    Siehe perldoc perlvar zur Erklaerung der Variable.

    Loesung: Entweder Du setzt vorher  $" = '' , oder Du gibst Deine Liste einfach vernuenftig aus, naemlich mit
      print LISTE @mitglieder2;

    HTH && So long

    --
    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the Universe trying to produce bigger and better idiots. So far, the Universe is winning.
        -- Rich Cook

    1. Danke Calocybe,

      das war des Rätsels Lösung!

      Loesung: Entweder Du setzt vorher  $" = '' , oder Du gibst Deine Liste einfach vernuenftig aus, naemlich mit
        print LISTE @mitglieder2;

      Luis