Martin M.: Array of Hash

Hi zusammen,

ich hab jetzt meine Datenstruktur zusammmen, aber komme nicht weiter bei meinem Problem.

my @AoH = (  
        {  
            server     => "fred",  
            type   => "slow",  
            size   => "10",  
        },  
        {  
            server     => "fred",  
            type   => "middle",  
            size   => "50",  
        },  
        {  
            server     => "fred",  
            type   => "middle",  
            size   => "50",  
        },  
        {  
            server     => "hans",  
            type   => "fast",  
            size   => "80",  
        }  
  );  
  

Nun will ich alle sizes vom selben server mit derselbem typ zusammenzählen und in ein neues AoH überführen und weiss nicht, wie ich das am geschicktesten machen soll.

Ergebnis sollte sein:

my @AoH_neu = (  
        {  
            server     => "fred",  
            type   => "slow",  
            size   => "10",  
        },  
        {  
            server     => "fred",  
            type   => "middle",  
            size   => "100",  
        },  
        {  
            server     => "hans",  
            type   => "fast",  
            size   => "80",  
        }  
  );  
  

Ich hab schonmal ein bisschen rumprobiert.

for my $i ( 0 .. $#AoH ) {  
    unless ($seen{$AoH[$i]{server}}) {  
        $seen{$AoH[$i]{server}} = 1;  
        push(@uniq, $AoH[$i]{server});  
  
    }  
  
}

So hab ich zwar alle server von dem hash "unique" in einem array, aber kein plan, wie ich dann weitermachen sollte.
Danke für nen Tipp.

ciao,
Martin M.

  1. my @AoH = (

    {
                server     => "fred",
                type   => "slow",
                size   => "10",
            },
            {
                server     => "fred",
                type   => "middle",
                size   => "50",
            },
            {
                server     => "fred",
                type   => "middle",
                size   => "50",
            },
            {
                server     => "hans",
                type   => "fast",
                size   => "80",
            }
      );

    
    >   
    > Nun will ich alle sizes vom selben server mit derselbem typ zusammenzählen und in ein neues AoH überführen und weiss nicht, wie ich das am geschicktesten machen soll.  
      
    Ich kenne keinen Einwegschritt von einem AoH zu einem AoH  
    Ich kenne einen Einwegschritt von einem AoH zu einem HoH  
    Aus dem HoH lässt sich dann der neue AoH ableiten.  
      
    #mit HoH  
    my %HoH;  
    foreach( @AoH ){  
     $HoH{ ${$\_}{server} }{ ${$\_}{type} } +=  ${$\_}{size} ;  
    }  
    #Ausgabe:  
    foreach(keys %HoH){  
        foreach my $i( keys %{ $HoH{$\_} } ){  
          print "server:", $\_, ", type:", $i, ", size:", $HoH{$\_}{$i}, "\n";  
        }  
    }  
      
      
    mfg Beat
    
    -- 
    Woran ich arbeite:  
    [X-Torah](http://www.elcappuccino.ch/cgi/tok.pl?extern=1-pub-com3306-1)  
    
    ><o(((°>           ><o(((°>  
    
       <°)))o><                     ><o(((°>o  
    
    
    1. Ich kenne keinen Einwegschritt von einem AoH zu einem AoH
      Ich kenne einen Einwegschritt von einem AoH zu einem HoH
      Aus dem HoH lässt sich dann der neue AoH ableiten.

      #mit HoH
      my %HoH;
      foreach( @AoH ){
      $HoH{ ${$_}{server} }{ ${$_}{type} } +=  ${$_}{size} ;
      }
      #Ausgabe:
      foreach(keys %HoH){
          foreach my $i( keys %{ $HoH{$_} } ){
            print "server:", $_, ", type:", $i, ", size:", $HoH{$_}{$i}, "\n";
          }
      }

      mfg Beat

      Hi,

      das ist schlicht grossartig! Danke.
      Ich bin seit Tagen dran und komme auf so eine Lösung nicht. Aber immerhin verstehe ich sie.

      Es funktioniert ja so ähnlich wie der "seen"-hash in dem unique-beispiel, aber eben mit einem HoH und dem Wert von size, anstatt mit einer 1.

      Da fehlt mir glaub wirklich das Programmierhirn um auf solche Lösungen zu kommmen :(

      ciao,
      Martin