christoph (nasty): Unbekannte Schluessel bei Hashes

Guten Tag mitnander,

folgendes Problem, ich habe nen Hash der etwa so Aufgebaut ist:
%hash=>Repository=>SessionID=>Username=>Ueberpunkt=>Wert

Nun hab ich folgendes Problem, alle Namen ausser die Ueberpunkte (welche vorgegeben sind) sind variabel, es gibt aber z.B. pro SessionID nur einen Usernamen..

Ist es irgendwie moeglich mit nur bekannter SessionID den Wert zu fuellen? (also teoretisch in der Art wie: %hash{*}{$SessionID}{*}{"Login"} = 5; schematisch gedacht ;)

MfG

  1. folgendes Problem, ich habe nen Hash der etwa so Aufgebaut ist:
    %hash=>Repository=>SessionID=>Username=>Ueberpunkt=>Wert

    Was bedeutet das?
    aus dieser Beschreibung geht nicht hervor wie deine Struktur aufgebaut ist. Sind das alles Schlüßelbezeichnungen oder sind das Platzhalter für Variabeln?

    Ist es irgendwie moeglich mit nur bekannter SessionID den Wert zu fuellen? (also teoretisch in der Art wie: %hash{*}{$SessionID}{*}{"Login"} = 5; schematisch gedacht ;)

    zeg doch mal, wie der HASH aufgebaut ist. Ein bisschen code ausschnitt wäre nicht schlecht.
    Sonst wird das evtl. nur raterei.

    Struppi.

    1. Ok, hier der Codeausschnitt:

      if ($loginwerte =~ /-ERROR Login of a user via Web Access : User: (.*) session ID: ([0-9]{10}) Logged On to (.*)/)
        {
         $unixtime = datum($loginwerte);
         $hash{$3}{$2}{$1}{"Login"} = $unixtime;
        }

      so sollte es normal ablaufen.

      Nur leider sind die Logzeilen bei Timeouts nicht vollständig, sprich es wird nur die SessionID uebergeben (Mon Jul 05 07:28:32 2004 -SYS    : Session ([0-9]{10}) is being closed due to timeout).. der Zeitwert muesste aber folglich als $hash{$3}{$2}{$1}{"Logout"} = $unixtime; gespeichert werden - darin liegt mein Problem, da nur $2 bekannt ist

      Danke fuer moegliche hilfe

      MfG

      1. Hallo christoph (nasty)

        Ok, hier der Codeausschnitt:

        if ($loginwerte =~ /-ERROR Login of a user via Web Access : User: (.*) session ID: ([0-9]{10}) Logged On to (.*)/)
          {
           $unixtime = datum($loginwerte);
           $hash{$3}{$2}{$1}{"Login"} = $unixtime;
          }

        Mhhh, was $3 für ein Wert?
        Welcher Schlüssel ist eindeutig?
        $1, $2 oder $3?

        Variabeln als Keys zu speichern ist nicht sinnvoll, lediglich der Hauptschlüssel sollte eine eindeutige (d.h. einmaliger vorkommender Wert) Variabel sein und für die anderen Schlüssel wäre ein Aussagekräftige Bezeichnung sinnvoll

        z.b. so:

        if ($loginwerte =~ /-ERROR Login of a user via Web Access : User: (.*) session ID: ([0-9]{10}) Logged On to (.*)/)
        {
        $hash{$name} = {
        unixtime =>  datum($loginwerte) || '',
        s_id => $2 || '',
        log_on => $3 || ''
        }

        In der Annahme, das der $name nur einmal vorkommen kann.

        Aber es hängt alles von deinem weiteren Vorgehen ab.

        Struppi.

        1. Ola,

          $3 ist der Name der Maschine auf welcher sich der Benutzer angemeldet hatte.
          Der eindeutige Wert ist $2 also die SessionID, aber den Aufbau hatte ich so gewaehlt weil es am Ende vom Sortieren und Abzaehlen her praktischer waere. (Sortierung erst nach Maschine, dann nach Anzahl der Anmeldungen pro User)

          Merci

          1. $3 ist der Name der Maschine auf welcher sich der Benutzer angemeldet hatte.
            Der eindeutige Wert ist $2 also die SessionID, aber den Aufbau hatte ich so gewaehlt weil es am Ende vom Sortieren und Abzaehlen her praktischer waere. (Sortierung erst nach Maschine, dann nach Anzahl der Anmeldungen pro User)

            Praktisch ist das nicht wirklich, da du ja in deinem Falle auch undefinierte Werte hast geht es auch nicht. Du kannst ja schlecht ein undef als Schlüssel benutzen.

            ich frag mich auch wie du auf die Werte zugreifst. Da du ja wenn du nicht weißt was für einen Wert der key hat, nicht direkt zugreifen kannst, sondern immer erst ein Array erzeugen musst.

            Struppi.

  2. Nur leider sind die Logzeilen bei Timeouts nicht vollständig, sprich es wird nur die SessionID uebergeben (Mon Jul 05 07:28:32 2004 -SYS    : Session ([0-9]{10}) is being closed due to timeout).. der Zeitwert muesste aber folglich als $hash{$3}{$2}{$1}{"Logout"} = $unixtime; gespeichert werden - darin liegt mein Problem, da nur $2 bekannt ist

    Deine Datenstruktur ist scheiße. Nimm $2 als Schlüssel, knalle den Rest als HoH (wenn's bequem und speicherbläh sein soll) oder HoA (wenn's schnell laufen und fehleranfällig soll) rein, siehe perldsc http://perldoc.com/perl5.8.4/pod/perldsc.html.

    HoH

    $hashoh{$2} = {
     'user' => $1,
     'repo' => $3,
     'login' => $unixtime,
    };
    print $hashoh{$sessid}{'repo'};

    HoA

    $hashoa{$2} = [
     $1,
     $3,
     $unixtime,
    ];
    print $hashoa{$sessid}[1];

    use Data::Dumper;
    print Dumper %hashoh, %hashoa;