roger: Hash dynaisch erzeugen

Hallo,

Ich erzeuge mehrere Hash dynamisch

  
	for ($i=0; $i < 10; $i++)  
	{  
		%{"ITEM$i"} = ("foo","bar");  
	}  

Natürlich kommt folgende Fehlermeldung.

  
Can't use string ("ITEM0") as a HASH ref while "strict refs" in use at ./database line 77.  

Wie kann ich hier my einfließen lassen, oder die Meldung "nur" für diese Codezeile blockieren ????

Gruß
       roger

  1. Ich erzeuge mehrere Hash dynamisch

    Was du tunlichst unterlassen solltest.

    for ($i=0; $i < 10; $i++)
    {
    %{"ITEM$i"} = ("foo","bar");
    }

      
    Verwende statt dessen:  
      
    ~~~perl
    use strict;  
      
    my %DATA;  
    for(0 .. 9){  
        $DATA{$_} = ["foo","bar"];  
    }  
    
    

    mfg Beat

    --
    ><o(((°>           ><o(((°>
       <°)))o><                     ><o(((°>o
    Der Valigator leibt diese Fische
    1. Hallo,

      ich habe hier Probleme beim verwirklichen

      Ich habe ein Hash das Referenzen auf andere Hash besitzt.
      Diese Hash sind Speziell (Indexed)

        
      tie my %daten, "Tie::Hash::Indexed" or die $!;  
      tie my %maschinen, "Tie::Hash::Indexed" or die $!;  
        
      my $mem_masch='';  
        
      	($masch,$varname,$wert) = split(/;/,$_);  
        
      	if ($mem_masch eq '') { $mem_masch = $masch; }  
      	if ($masch eq $mem_masch)  
      	{  
      		$daten{$masch}{$varname} = $wert;  
      	}  
      	else  
      	{  
      		$maschinen{$counter} = ["foo","bar"];  
      		$counter++;  
      		$daten{$masch} = \$maschinen{$counter};  
        
      		$daten{$masch}->{$varname} = $wert;  
      		$mem_masch = $masch;  
      	}  
        
      	$daten{$masch}->{$varname} = $wert;  
      
      

      Erklärung: wenn $masch sich ändert dann soll ein neues Hash erzeugt werden und dessen Referenz auf das "Haupt" Hash geschreiben werden unter dem key $masch. Das spezielle Hash (Indexed) muss sein, wegen der Reihenfolge.

      Der Interpreter mault "Not a HASH reference at ...." Zeile ""$daten{$masch}->{$varname} = $wert;""

      .... und ich sehe es nicht.

      Gruß
                   roger

      1. ich habe hier Probleme beim verwirklichen

        Gz hast vor allem Verständnisprobleme mit
        Hashes, Array und deren Referenzen

        $var = [1,2]; #weist eine Arrayreferenz zu
        $var = {a=>1}; #weist eine Hashreferenz zu

        Weise einer Variable immer nur einen Datentyp zu. Mische nicht die Datentypen.

        Ich habe ein Hash das Referenzen auf andere Hash besitzt.
        Diese Hash sind Speziell (Indexed)

        tie my %daten, "Tie::Hash::Indexed" or die $!;
        tie my %maschinen, "Tie::Hash::Indexed" or die $!;

        my $mem_masch='';

        ($masch,$varname,$wert) = split(/;/,$_);

        if ($mem_masch eq '') { $mem_masch = $masch; }
        if ($masch eq $mem_masch)
        {
        $daten{$masch}{$varname} = $wert;

        Hier weist du einen Scalar zu

        }
        else
        {
        $maschinen{$counter} = ["foo","bar"];

        Hier weist du eine Array-referenz zu.

          $counter++;  
          $daten{$masch} = \$maschinen{$counter};  
        

        ist dasselbe wie
          $daten{$masch} = ["foo","bar"];
        Hier weisst du eine Referenz auf den Inhalt, welcher bereits eine Arrayreferenz ist, zu. Schaffst also eine Inkonsistenz.
        Entweder ist ein Scalar oder eine Array-Ref-Ref vorhanden.

          $daten{$masch}->{$varname} = $wert;  
        

        Hier aber rechnest du damit dass $daten($masch) eine hashreferenz enthält

          $mem_masch = $masch;  
        

        }

        $daten{$masch}->{$varname} = $wert;

          
        
        > Erklärung: wenn $masch sich ändert dann soll ein neues Hash erzeugt werden und dessen Referenz auf das "Haupt" Hash geschreiben werden unter dem key $masch. Das spezielle Hash (Indexed) muss sein, wegen der Reihenfolge.  
        >   
        > Der Interpreter mault "Not a HASH reference at ...." Zeile ""$daten{$masch}->{$varname} = $wert;""  
          
        Ich sehe nicht, was für Daten du speichern willst.  
          
        Warum erzeugst du nicht einfach einen Hash. Jeder Maschine wird eine hashreferenz zugewiesen.  
          
        $daten{$masch} = {  
             index => $counter,  
             name  => $varname,  
             value => $value,  
             };  
          
        Falls du eine neue Maschine anlegst kannst du den bisherigen Index abfragen mit  
        my $num\_of\_maschines = scalar keys $daten;  
          
        mfg Beat
        
        -- 
        
        ><o(((°>           ><o(((°>  
        
           <°)))o><                     ><o(((°>o  
        Der Valigator leibt diese Fische
        
        1. Hallo,

          tie my %daten, "Tie::Hash::Indexed" or die $!;
          tie my %maschinen, "Tie::Hash::Indexed" or die $!;

          ein Hash vom Typ %maschinen (Hash::Indexed) erzeugen (wäre so gedacht :-)

          $maschinen{$counter} = ["foo","bar"];

          eine Referenz von diesem Hash auf das "Haupthash" legen (wäre so gedacht :-)

          $daten{$masch} = $maschinen{$counter};

          Warum erzeugst du nicht einfach einen Hash. Jeder Maschine wird eine hashreferenz zugewiesen.

          $daten{$masch} = {
               index => $counter,
               name  => $varname,
               value => $value,
               };

          Natürlich soll es so in etwa aussehen, jedoch kann ich kein normales Hash benutze, sondern "MUSS" das Indexed Hash benutzen, die Reihenfolge wird bei der Erzeugung festegelegt und muss immer gleich bleiben.

          $daten{$masch} = referenz von Indexed-Hash [x]
          $maschinen[x] = namex => value, namey => value, name... =>value

          $daten{$masch} = referenz von Indexed-Hash [y]
          $maschinen[y] = namex => value, namey => value, name... =>value

          usw.

          zugreifen will ich $daten{'masch'}{'messwertname'} = 'messwert'
          das geht schneller einfacher als jedesmal den Index abzufragen.

          Danke
                roger

      2. tie my %daten, "Tie::Hash::Indexed" or die $!;
        tie my %maschinen, "Tie::Hash::Indexed" or die $!;

        my $mem_masch='';

        ($masch,$varname,$wert) = split(/;/,$_);

        if ($mem_masch eq '') { $mem_masch = $masch; }
        if ($masch eq $mem_masch)
        {
        $daten{$masch}$varname} = $wert;
        }
        else
        {
        $maschinen{$counter} = ["foo","bar"];
        $counter++;
        $daten{$masch} = $maschinen{$counter};

          $daten{$masch}->{$varname} = $wert;  
          $mem_masch = $masch;  
        

        }

        $daten{$masch}->{$varname} = $wert;

          
        Das Problem ist, du erstellst keine Referenz auf $daten{$masch}, um $daten{$masch}->{$varname} zu nutzen musst du erst eine Hashreferenz erzeugen.  
          
        `$daten{$masch} = {} unless $daten{$masch};`{:.language-perl}  
          
        Struppi.