jonny: Indexlänge eine Hashes

Hallo,

könnt Ihr mir schreiben, welche Erfahrungen Ihr mit Hashes bezüglich der Indexlänge habt?

Ich lese eine Parameterdatei aus und muss für jede Sektion, die ich auslese, einen Hash erzeugen in dem dann die Werte abgelegt werden. Nun ist es sehr schwer, einen eindeutigen Index für jede Sektion zu erzeugen, da bestimmte Werte in allen Sektionen auftreten können, auch sind die Sektionsnamen nicht immer eindeutig. Beispiel (die Sektionen heißen natürlich anders):

[ Sektion 1 ] # Der Name der Sektion kann mehrfach vorkommen.
Parm1=hello
Parm2=world
[/]

[ Sektion 2 ]
Parm1=hallo
Parm2=welt
[/]

[ Sektion 1 ] # hier ist der Name der Sektion doppelt
Parm1=salut
Parm2=monde
[/]

Nun möchte ich bestimmte Parameter aus eine Sektion als Index generieren, bei denen ich 100%ig weiß, dass sie immer eindeutig sein werden, als Beispiel $hash{sektion1salutmonde}.

Der Hintergrund ist, dass ich als Ziel habe, den Prozess, der übrigens nonstop läuft, nicht stoppen und starten muss, sondern "reloaden" kann, neue Sektionen hinzufügen und nicht mehr vorhandene löschen. Um das zu tun, muss ich die Sektionen eindeutig den Hashes zuweisen können.

Nun, wie lang darf so ein Index sein? Habt Ihr schonmal mit Indexes gearbeitet, die länger als 100 Zeichen waren?

Mfg,
Jonny

  1. 你好 jonny,

    Nun, wie lang darf so ein Index sein? Habt Ihr schonmal mit Indexes
    gearbeitet, die länger als 100 Zeichen waren?

    Mal abgesehen davon, dass ich das anders loesen wuerde, kannst du problemlos
    auch einige MB in einen Hash als Key stecken. Da brauchst du dir keine
    Gedanken zu machen.

    再见,
    CK

    --
    "Ich muss auflegen, mein Essen ist gleich fertig."
    "Oh, was gibt 's denn?"
    "Hmm. Die Packung liegt schon im Muell, keine Ahnung.
    1. Hallo Christian,

      Mal abgesehen davon, dass ich das anders loesen wuerde,

      ich bin keinesfalls abgeneigt, einen Tipp von dir entgegen zu nehmen.

      Ausserdem: 你好

      Was heißt das? Hallo?

      Mfg,
      Jonny

      1. 你好 jonny,

        Mal abgesehen davon, dass ich das anders loesen wuerde,

        ich bin keinesfalls abgeneigt, einen Tipp von dir entgegen zu nehmen.

        Du musst ja die richtige[tm] Reihenfolge gar nicht wissen, lies doch einfach
        die Datei komplett neu ein und ueberschreibe das alte. Das gibt dir mehr
        Freiheit beim Design der Datenstrukturen, dann kannst du mit Arrays und so
        arbeiten. Mal ein kleiner Beispiel-Code:

          
        sub get_conf {  
          my $file = shift;  
          my $conf = {};  
          my $sect = '';  
          local *DAT;  
          
          open DAT,'<',$file or do {  
            print STDERR "Could not open file $file: $!";  
            return;  
          };  
          
          while(my $line = <DAT>) {  
            if($line = /^\s*\[\s*(\w+)\s*\]) {  
              $sect = $1;  
              next;  
            }  
          
            if($line =~ /^\s*(\w+)=(.*)$/) {  
              $conf->{$sect||'global'}->{$1} = $2;  
              next;  
            }  
          
            $sect = '' if $line =~ m!\[/\]!;  
          }  
          
          close DAT;  
          
          return $conf;  
        }  
        
        

        Beim Reload machst du jetzt einfach $conf = get_conf("filename"),
        wobei $conf die Konfigurations-Variable ist. Schon
        hast du kein Problem mehr mit irgendwelchen Abgleichen.

        Ausserdem: 你好

        Was heißt das? Hallo?

        Genau.

        再见,
        CK

        --
        89,7% aller Statistiken sind frei erfunden!
        1. Hallo nochmal Christian,

          Du musst ja die richtige[tm] Reihenfolge gar nicht wissen, lies doch einfach
          die Datei komplett neu ein und ueberschreibe das alte. Das gibt dir mehr
          Freiheit beim Design der Datenstrukturen, dann kannst du mit Arrays und so arbeiten

          oh wie schön wäre das, geht aber leider nicht.

          Also derzeit lege ich die Parameter in Array ab und den Reload Mechanismus baue ich gerade ein.

          Nun mein Problem ist, dass ich während des Prozesslaufs verschiedene Statuswerte für jede Sektion sammel, die auf keinen Fall verloren gehen dürfen, deshalb darf ich nichts überschreiben, sondern nur neue Sektionen hinzufügen, nicht mehr vorhandene löschen und geänderte Sektionen... klar, die werden überschrieben. Wenn sich die Reihenfolge der Sektionen in der Parameterdatei ändert - und das wird sie öfters bei neuen Konfigurationen -, dann zerstöre ich auch die Referenzen der Arrays zueinander, denn die Referenz der Arrays zueinander sind ja die Zahlen. Zum Beispiel wenn eine Sektion gelöscht wurde und den entsprechenden Index aus alles Arrays entfernen muss.

          Mfg,
          Jonny

        2. 你好 jonny,

          sorry, der Code war so natuerlich quatsch. Nochmal in richtig:

            
          sub get_conf {  
            my $file = shift;  
            my $conf = {};  
            my $sect = '';  
            local *DAT;  
            
            open DAT,'<',$file or do {  
              print STDERR "Could not open file $file: $!";  
              return;  
            };  
            
            while(my $line = <DAT>) {  
              if($line = /^\s*\[\s*(\w+)\s*\]) {  
                $sect = $1;  
                $conf->{$sect} = [$conf->$sect] if exists $conf->{$sect};  
                next;  
              }  
            
              if($line =~ /^\s*(\w+)=(.*)$/) {  
                $sect = 'global' unless $sect;  
            
                if(ref $conf->{$sect} eq 'ARRAY') {  
                  if(exists $conf->{$sect}->[-1]->{$1}) {  
                    $conf->{$sect}->[-1]->{$1} = [$conf->{$sect}->[-1]->{$1}];  
                    push @{$conf->{$sect}->[-1]->{$1}},$2;  
                  }  
                  else {  
                    $conf->{$sect}->[-1]->{$1} = $2;  
                  }  
                }  
                else {  
                  $conf->{$sect}->{$1} = $2;  
                }  
            
                $sect = '' if $sect eq 'global';  
                next;  
              }  
            
              $sect = '' if $line =~ m!\[/\]!;  
            }  
            
            close DAT;  
            
            return $conf;  
          }  
          
          

          Jetzt sollte es passen... hatte die doppelten Sachen nicht
          beruecksichtigt.

          再见,
          CK

          --
          So, wie ein Teil ist, ist das Ganze.