Ed X: Script funktioniert nur local (Versionskonflikt?)

Hi an alle,

Eine subroutine in einem script soll folgendes leisten:

aus einer csv-datei der Art:

name|mailaddress|mobile|phone|rubrik|pw
Schnuffil|schnuffel@schnuffel.de|0169-55555555|030-12345678|design|sChN
Stoffel|stoff@stoff.de|0169-9876543|080-4444444|design, pr|STsT
Pumuckel|pumucke@mst.eder.de|555-1234567|0555-2468135|design|roteHaare
naechster|naechster@next.de|0555-0000000|000-0000000|Prod|letzter

soll in einen zweidimensionalen Hash geparst werden. Also isoliere ich erst die erste Zeile, und ermittle die keywords:

Opens the membersdb-file

open(MEMBERS,"<$membersfile") || &exit_on_error("$membersfile cannot be opened!");
 my @readmembers = <MEMBERS>;
 close(MEMBERS);
 # entferne erste Zeile und ermittel die schluesselworte
 @keynames = split /|/, shift(@readmembers);
 # der letzte key hat einen Zeilenumbruch hintendran, aber nicht mehr lange....
 chomp $keynames[-1];

Das funktioniert on- wie offline :-).

Als nächstes iteriere ich über @readmembers (alle Zeilen) und innerhalb jeder iteration nochmal über jeden neuen Array und orden die werte den keywords zu:

erzeugung eines 2dimensionalen hashes

foreach $readmember (@readmembers)
  {
  # jede Zeile hat einen Zeilenumbruch hintendran, kann ich nicht brauchen....
  chomp($readmember);
  # parse die zeilen in temporaeres array
  my @member_line = split /|/, $readmember;
  # ordne jeden wert einem key zu
  for($i=0; $i<=$#member_line; $i++)
   {
   $members{$member_line[0]}{$keynames[$i]} = $member_line[$i];
   }
  }

Offline geht das alles, aber online wird der letzte wert (hier "pw") nicht an den Array angehängt. Also eine Iteration über @keywords zeigt an, das es dort "pw" gibt. Aber im großen Hash gibt es das nicht!

Woran könnte das liegen?

Bye Ed X
PS: Die Subroutine im ganzen:
sub parse_members {
 # Opens the membersdb-file
 open(MEMBERS,"<$membersfile") || &exit_on_error("Systemfailure or missing cofiguration:<br>There is no database file for the members or it cannot be opened!");
 my @readmembers = <MEMBERS>;
 close(MEMBERS);
 # entferne erste Zeile und ermittel die schluesselworte
 @keynames = split /|/, shift(@readmembers);
 # der letzte key hat einen Zeilenumbruch hintendran, aber nicht mehr lange....
 chomp $keynames[-1];
 # erzeugung eines 2dimensionalen hashes
 foreach $readmember (@readmembers)
  {
  # jede Zeile hat einen Zeilenumbruch hintendran, kann ich nicht brauchen....
  chomp($readmember);
  # parse die zeilen in temporaeres array
  my @member_line = split /|/, $readmember;
  # ordne jeden wert einem key zu
  for($i=0; $i<=$#member_line; $i++)
   {
   $members{$member_line[0]}{$keynames[$i]} = $member_line[$i];
   }
  }
}

  1. Moin,

    aus einer csv-datei der Art:

    name|mailaddress|mobile|phone|rubrik|pw

    ^^

    das solltest du crypten.

    soll in einen zweidimensionalen Hash geparst werden. [...]

    ich kann dein Problem hier nicht nachvollziehen. (Perl 5.6.0, Win32)
    Dafuer hab ich aber das ganze mal lesbarer aufgeschrieben (und strict-faehig ;)
    vielleicht gibts ja online tatsaechlich ein Problem mit nichtlokalisierten Variablen oder so.
    Ach und nochwas: name ist jetzt eine redundante Information, das waere evtl. noch ein schoenheitsfehler ;)

    #!/usr/bin/perl -w
    use strict;
    use Data::Dumper;

    sub parse_members ($) {
      my $membersfile = shift;

    # Opens the membersdb-file
      # bla, open, close etc.
      # bei open *und* close auf Fehler pruefen!
      #
      my @readmembers = <DATA>;

    # remove \n
      #
      chomp @readmembers;

    # entferne erste Zeile und ermittel die schluesselworte
      #
      my @key = split /|/ => shift(@readmembers);

    # erzeugung eines 2dimensionalen hashes
      #
      my %members = map {
        my $i=0;
        my %hash = map {$key[$i++] => $_} split /|/ => $_;
        ($hash{name} => %hash);
      } @readmembers;

    %members;
    }

    my $members = parse_members ('filename');
    print Dumper ($members);

    __END__
    name|mailaddress|mobile|phone|rubrik|pw
    Schnuffil|schnuffel@schnuffel.de|0169-55555555|030-12345678|design|sChN
    Stoffel|stoff@stoff.de|0169-9876543|080-4444444|design, pr|STsT
    Pumuckel|pumucke@mst.eder.de|555-1234567|0555-2468135|design|roteHaare
    naechster|naechster@next.de|0555-0000000|000-0000000|Prod|letzter

    evtl. hilfts ja schon,

    Viele Gruesse,

    n.d.p.

    1. Hallo,

      aus einer csv-datei der Art:

      name|mailaddress|mobile|phone|rubrik|pw
                                              ^^

      das solltest du crypten.

      Du meinst einen OneWayHash? zb MD5?

      ich kann dein Problem hier nicht nachvollziehen. (Perl 5.6.0, Win32)

      ................................................................^^^^^
      der ist vermutlich negativ aufgefallen

      Dafuer hab ich aber das ganze mal lesbarer aufgeschrieben (und strict-faehig ;)

      Half nicht beim Problem, aber bei meinem Programmierstil :-)

      vielleicht gibts ja online tatsaechlich ein Problem mit nichtlokalisierten Variablen oder so.

      nein es war der Zeilenumbruch

      #!/usr/bin/perl -w
      use strict;
      use Data::Dumper;

      sub parse_members ($) {
        my $membersfile = shift;

      # Opens the membersdb-file
        # bla, open, close etc.
        # bei open *und* close auf Fehler pruefen!
        #
        my @readmembers = <DATA>;

      # remove \n
        #
        chomp @readmembers;

      .....^^^^^^^^^^^^^^^^^^^
      das hat ihm nicht gereicht,
      also ich habe nochmal den letzten jeder Zeile beim Wickel genommen und ihm gezeigt, wo der Hammer hängt:

      $keynames[-1] =~ s/\s//gs;

      das hat das Problem gekillt <eg>
      wodurch passworte natürlich keine Whitespaces haben dürfen, aber bei MD5 kein Problem, oder?

      ob es was damit zu tun hat?
      SERVER_SOFTWARE = Apache/1.3.6 (Unix) (Red Hat/Linux) PHP/3.0.8

      Keine Ahnung :-(

      Ich danke für die Hilfe.

      Bye Ed X

      1. Moin,

        name|mailaddress|mobile|phone|rubrik|pw
                                                ^^
        das solltest du crypten.
        Du meinst einen OneWayHash? zb MD5?

        ja, oder einfach mit crypt ;)

        ich kann dein Problem hier nicht nachvollziehen. (Perl 5.6.0, Win32)
        ................................................................^^^^^
        der ist vermutlich negativ aufgefallen

        [_] du hast Win32 lokal?

        nein es war der Zeilenumbruch

        wenn du oben ein Kreuz setzen kannst:
        hast du vielleicht die members-Datei nicht im ASCII-Modus hochgeladen?

        chomp @readmembers;
        .....^^^^^^^^^^^^^^^^^^^
        das hat ihm nicht gereicht,
        $keynames[-1] =~ s/\s//gs;

        das wuerde das erklaeren.

        wodurch passworte natürlich keine Whitespaces haben dürfen, aber bei MD5 kein Problem, oder?

        denkst du eigentlich daran, dass in keinem Feld Pipes vorkommen duerfen?
        Und dass die Datei sinnigerweise ge(f)lockt werden sollte?;-)

        Viele Gruesse,

        n.d.p.

        1. Hi,

          [_] du hast Win32 lokal?

          Ja, Win32 Local und Unix war online.

          wenn du oben ein Kreuz setzen kannst:
          hast du vielleicht die members-Datei nicht im ASCII-Modus hochgeladen?

          Peinlich, peinlich, mein LeechFtp war neu installiert und nicht neu konfiguriert. grmpf.....
          Aber ich bin beeindruckt von deinen Ferndiagnosefähigkeiten.

          denkst du eigentlich daran, dass in keinem Feld Pipes vorkommen duerfen?

          Und dass die Datei sinnigerweise ge(f)lockt werden sollte?;-)

          Die Pipes werden abgefangen, aber die Geschichte ist sowieso noch nicht zum online editieren freigegeben. Muss sie beim nur-lese-zugriff auch ge(f)lockt werden??

          Bye Ed X

          1. Moin!

            Die Pipes werden abgefangen, aber die Geschichte ist sowieso noch nicht zum online editieren freigegeben. Muss sie beim nur-lese-zugriff auch ge(f)lockt werden??

            Wenn *alle* nur lesen, dann nicht. Aber sobald einer schreiben will, muessen *alle* (f)locken (oder sich anderweitig synchronisieren).

            So long