PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Hash auf Hash erstellen


Timi79
09.06.2008, 22:41
Hallo!

Mal wieder ein Prob, wo ich noch keine richtige Lösung finde!

Folgende zwei Hashes habe ich.

my %int = ("eth0/0" => "2", "eth0/1" => "3");

my %macs = (
"1.2.0.2" => "AA:BB:CC",
"1.2.1.2" => "DD:EE:FF",
"1.3.0.3" => "GG:HH:II",
"1.3.1.3" => "JJ:KK:LL",
Entstehen soll dann folgendes (Hash auf Hash)

my %int = (
"eth0/0" => {"1.2.0.2" => "AA:BB:CC",
"1.2.1.2" => "DD:EE:FF",},

"eth0/1" => {"1.3.0.3" => "GG:HH:II",
"1.3.1.3" => "JJ:KK:LL",},
};
d.h. die letzte Zahl der Keys von %macs gehört wieder zum Value des Hashes %int. d.h. aus einem Hash sollen zwei neue erstellt werden und die Referenz z.B. wieder als Value zum richtigen Interface im Hash %int abgelegt werden.

Das nächste Prob ist, dass der Hash %int eine dyn. Größe haben kann. d.h. mal soll(ten) einer, zwei oder drei usw. Hashes angelegt werden, je nachdem wieviel Interfaes darin gespeichert sind.

Hat da jemand ne Idee wie ich das umsetzen könnte?

Vielen Dank

EDIT: Die wohl endscheidenste Frage ist wohl, wie ich dyn. viele Hashes (Anzahl der Keys in %int) erstellen kann.


jamenai
17.07.2008, 11:35
Ich steig da zwar gerade noch nicht ganz durch aber warum nicht einfach eine Referenz auf eine Liste an die hash übergeben?

In der Liste kannst du ja auf die zweite Hash wieder verweisen ;-)

Vielleicht hilft dir das, ich weiss halt nicht ob ich dich richtig verstanden haben ...

eViL_oNe
17.07.2008, 22:47
das zweite Problem kapiere ich nicht -- Hashes haben doch eigentlich immer eine dynamische Größe?

einen hash von hashes kann man ja in etwa so anlegen:

$hash = {}; # referenz auf einen hash
$hash->{'key'} = {}; # element vom hash ist eine referenz auf einen anderen hash
$hash->{'key'}->{'subkey'} = 'value';

die ganze Aufgabe lässt sich wohl am geschicktesten dadurch lösen, dass man aus dem zweiten Hash eine Zwischenstruktur aufbaut, bei der am Anfang die normalisierten Keys stehen:

my %temp = (
"2" => {"1.2.0.2" => "AA:BB:CC",
"1.2.1.2" => "DD:EE:FF",},

"3" => {"1.3.0.3" => "GG:HH:II",
"1.3.1.3" => "JJ:KK:LL",},
};

als nächstes muss man nur noch den ersten Hash durchlaufen und dessen Values in dieser Zwischenstruktur finden. Den endgültigen hash baut man dann so zusammen:

$int2{$key} = $temp{$value};

wobei int2 der gewünschte End-Hash ist und $key und $value Schlüssel-Wert aus $int

Damit kann man die Aufgabe sogar mit linearem Aufwand lösen (die naheliegendste Idee würde einen quadratischen Aufwand bedeuten)