Frank1985: Hash auf Hash mit eval

Hallo zusammen,

ich erzeuge mir einen Hash:
my %testhash;

und lese eine Zeile der Form: "name" => "wert" ein.
Der Wert soll als key des hash dienen und zusätzlich soll diese Zeile zu diesem Schlüssel gespeichert werden.
Also sowas in der Art:
$testhash{'wert'}{'name'}=wert;

So einen Baum möchte ich aufbauen.

%test = eval $zeile;  
$keywert = $test{'name'}; #Das geht, geht aber vielleicht auch in einem Befehl, weiß aber nicht wie!  
  
$testhash{$keywert}=eval $zeile; #Das geht nicht  
  
print $testhash{$keywert}{name}; #Das geht auch nicht!

Einer ne Idee?

  1. Hallo zusammen,

    ich erzeuge mir einen Hash:
    my %testhash;

    und lese eine Zeile der Form: "name" => "wert" ein.
    Der Wert soll als key des hash dienen und zusätzlich soll diese Zeile zu diesem Schlüssel gespeichert werden.
    Also sowas in der Art:
    $testhash{'wert'}{'name'}=wert;

    So einen Baum möchte ich aufbauen.

    %test = eval $zeile;

    $keywert = $test{'name'}; #Das geht, geht aber vielleicht auch in einem Befehl, weiß aber nicht wie!

    $testhash{$keywert}=eval $zeile; #Das geht nicht

    print $testhash{$keywert}{name}; #Das geht auch nicht!

    
    >   
    > Einer ne Idee?  
    >   
    
    »»  
    Hab das Problem jetzt fast gelöst nur geschieht die Zuweisung:  
    `$testhash{$keywert}={eval $zeile}; `{:.language-perl}  
    in einer Schleife und darin in einem if else, aber die Werte der Zuweisung scheinen nur in dem Bereich gültig zu sein und nicht global.
    
    1. Moin Moin!

      Hab das Problem jetzt fast gelöst nur geschieht die Zuweisung:
      $testhash{$keywert}={eval $zeile};
      in einer Schleife und darin in einem if else, aber die Werte der Zuweisung scheinen nur in dem Bereich gültig zu sein und nicht global.

      Sagt Dir XY-Problem irgendetwas?

      Erkläre Dein eigentliches Problem, dann kannst Du auch eine vernünftige Lösung bekommen. Du baust hier riesige Sicherheitslücken: Was passiert, wenn Du eine Zeile "rm -rf /" bzw. "format c: /q /u" einliest?

      Alexander

      --
      Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so".
      1. Moin Moin!

        »» Hab das Problem jetzt fast gelöst nur geschieht die Zuweisung:
        »» $testhash{$keywert}={eval $zeile};
        »» in einer Schleife und darin in einem if else, aber die Werte der Zuweisung scheinen nur in dem Bereich gültig zu sein und nicht global.

        Sagt Dir XY-Problem irgendetwas?

        Erkläre Dein eigentliches Problem, dann kannst Du auch eine vernünftige Lösung bekommen. Du baust hier riesige Sicherheitslücken: Was passiert, wenn Du eine Zeile "rm -rf /" bzw. "format c: /q /u" einliest?

        Alexander

        Ich hab schon abgefangen das diese Zeile in diesem Format ist!

        Also so sieht es bisher aus:

        my %test = ();  
        my %ergebnis = ();  
        foreach my $zeile(@array){#@array sind die eingelesenen Zeilen  
            if(...){#Prüfung auf richtige Zeile - Art: "name" => "wert"  
               %test = eval $zeile;  
               $actKey = $test{'name'};  
               $ergebnis {$actKey}={eval $zeile};  
               print $ergebnis {$actKey}{'name'},"\n"; #Ausgabe des Wert - richtig  
            }  
            ...  
        }  
        while( my ($k, $v) = each %ergebnis) {  
           print $ergebnis{$k}{'name'},"\n"; #Problem!  
        }
        

        Fehlermeldung:
        Use of uninitialized value in print at ./mein_programm line xx.

        Und diese Line ist das print in der while-Schleife.
        Auch ein print in anderen if-Anweisungen innerhalb der for-Schleife meldet den selben Fehler.

        Hoffe das ist genauer - das ist der komplette Code.

        1. »» Moin Moin!
          »»
          »» »» Hab das Problem jetzt fast gelöst nur geschieht die Zuweisung:
          »» »» $testhash{$keywert}={eval $zeile};
          »» »» in einer Schleife und darin in einem if else, aber die Werte der Zuweisung scheinen nur in dem Bereich gültig zu sein und nicht global.
          »»
          »» Sagt Dir XY-Problem irgendetwas?
          »»
          »» Erkläre Dein eigentliches Problem, dann kannst Du auch eine vernünftige Lösung bekommen. Du baust hier riesige Sicherheitslücken: Was passiert, wenn Du eine Zeile "rm -rf /" bzw. "format c: /q /u" einliest?
          »»
          »» Alexander

          Ich hab schon abgefangen das diese Zeile in diesem Format ist!

          Also so sieht es bisher aus:

          my %test = ();

          my %ergebnis = ();
          foreach my $zeile(@array){#@array sind die eingelesenen Zeilen
              if(...){#Prüfung auf richtige Zeile - Art: "name" => "wert"
                 %test = eval $zeile;
                 $actKey = $test{'name'};
                 $ergebnis {$actKey}={eval $zeile};
                 print $ergebnis {$actKey}{'name'},"\n"; #Ausgabe des Wert - richtig
              }
              ...
          }
          while( my ($k, $v) = each %ergebnis) {
             print $ergebnis{$k}{'name'},"\n"; #Problem!
          }

          
          > Fehlermeldung:  
          > Use of uninitialized value in print at ./mein\_programm line xx.  
          >   
          > Und diese Line ist das print in der while-Schleife.  
          > Auch ein print in anderen if-Anweisungen innerhalb der for-Schleife meldet den selben Fehler.  
          >   
          > Hoffe das ist genauer - das ist der komplette Code.  
            
          Muss wohl noch etwas ergänzen, da ich glaub zu wissen, wo das Problem ist, ich habe weitere elsif die fast den Identischen Code haben nur einen anderen Kopf haben also:  
          ~~~perl
          elsif(...){  
                 %test = eval $zeile;  
                 $actKey = $test{'name'};  
                 $ergebnis {$actKey}={eval $zeile}; <-- Da scheint das Problem zu sein, ich möchte die Hashtable für den selben Key erweitern und da macht er wohl nicht das was ich will.  
                 print $ergebnis {$actKey}{'name'},"\n"; #Ausgabe des Wert - richtig  
              }
          

          Grüße

          1. Moin Moin!

            1. Bitte KEINE Fullqoutes.
            2. Du hast ein XY-Problem. Erkläre Dein wirkliches Problem, nicht Deinen Lösungsansatz.
            3. eval $string ist böse.
            4. use strict, use warnings.

            Alexander

            --
            Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so".
          2. Warum machst du dir das Leben nicht einfach.
            Wenn du Perl Datenstrukturen in einem File speichern willst:

            use Storable qw(lockstore lockretrieve);

            Dein Ansatz mit eval ist gefährlich und stümperhaft.

            mfg Beat

            --
            ><o(((°>           ><o(((°>
               <°)))o><                     ><o(((°>o
            Der Valigator leibt diese Fische
  2. Moin Moin!

    eval $string ist böse, genau wie in Javascript.

    Entferne das Zeilenende (chomp), zerteile deine Zeile anhand des Trennzeichens in genau zwei Teile (split mit drei Agrumenten), entferne überflüssigen Whitespace rund um Schlüssel und Wert (s///), entferne Quotes (s///), speichere Schlüssel und Wert im Hash.

    Alexander

    --
    Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so".
  3. also um eine Zeile zu parsen, brauchst du kein eval.

    my %h;
    while(<>){
     /^(.*?)=>(.*?)\n/ and $h{$2}{$1}=$2;
    }

    mfg Beat

    --
    ><o(((°>           ><o(((°>
       <°)))o><                     ><o(((°>o
    Der Valigator leibt diese Fische