Schrift
[thread]12636[/thread]

Ein Array in einem Hash zu einem Hash umwandeln

Leser: 2


<< >> 5 Einträge, 1 Seite
Ensretted
 2008-10-14 17:43
#115508 #115508
User since
2008-07-23
11 Artikel
BenutzerIn
[default_avatar]
Hallo Leute,
habe mal wieder ein kleines Problem.
Habe folgende Definition (Hash von Arrays):

my %HvA = ("s" => ["57", "01"],
"57" => ["01"],
"01" => ["00"],
"00" => ["20"],
"20" => ["00", "50", "21"],
"50" => ["50", "58"],
"21" => ["21", "3x"],
"58" => ["58"],
"3x" => ["3x"]
);

Wie ich auf ein Array zugreifen kann (in Array kopieren) => no prob
my @temp = @{$HvA{"s"}};
=> @temp = (57, 01)

Nun moechte ich aber dieses Array als Hash haben.
Normalerweise kann man ja %hash = inverse %hash_old verwenden.
=> Werte waeren nun Schluessel und umgekehrt.
das funzt jedoch bei einem ref. Array leider nicht.

D.h. ich moechte haben:
%hash_neu = ("57" => "s", "01"=>"s");

Hat jemand eine Idee? bzw kann mir helfen?


Danke fuer die Muehe im Voraus.
Gruss Ens

PS: sorry wegen der Umlaute - habe mir engl. Tastatur zugelegt.
MatthiasW
 2008-10-14 17:49
#115509 #115509
User since
2008-01-27
367 Artikel
BenutzerIn
[default_avatar]
Code (perl): (dl )
1
2
3
for my $key ( keys %HvA ) {
    $hash_neu{$_} = $key for @{ $HvA{$key} };
} # for

MfG

edit: Bei deinem Beispiel-Hash werden dabei aber Werte verloren gehen, weil einige Keys mehrfach vorkommen, oder habe ich dein Problem falsch verstanden?
perl -E'*==*",s;;%ENV=~m,..$,,$&+42;e,$==f;$"++for+ab..an;@"=qw,u t,,print+chr;sub f{split}say"@{=} me"'
Ensretted
 2008-10-14 18:03
#115511 #115511
User since
2008-07-23
11 Artikel
BenutzerIn
[default_avatar]
Hallo MatthiasW,
danke fuer die Antwort.

Habe das so umgesetzt (mit %ExpStates):
for (@{$HvA{$HvA{$type}}}) { $ExpStates{$_} = $HvA{$type} }

Denke, das hast du :-)...falsch verstanden.
Ich moechte keinen Hash ueber alle Schluessel, sondern nur von einem
bestimmten.

Hintergrund:
das ist eine Statemachine, welche die zulaessigen Nachfolger-Zustaende
beinhaltet.
Wenn nun ein neuer Zustand erreicht wird (aus Datei eingelesen),
wird ueberprueft, ob dieser Zustand (ausgehend vom Vorgaenger)
akzeptiert wird.

Aber Danke fuer die schnelle und gute Antwort.

Gruss
Ens

PS: Thread finished - Loesung gefunden
MatthiasW
 2008-10-14 18:12
#115512 #115512
User since
2008-01-27
367 Artikel
BenutzerIn
[default_avatar]
Ok, wegen dem inverse dachte ich du möchtest den ganzen Hash umpolen ;)

Die Lösung, die du jetzt gepostet hast sieht aber auch nicht so aus als würde sie dir bei der oben geposteten Struktur weiterhelfen, oder hast du da nur versehentlich ein $HvA{...} zuviel gepostet?

Mit nachgestelltem for siehts übrigens noch hübscher aus ;)
Code (perl): (dl )
$ExpState{$_} = $type for @{ $HvA{$type} };

MfG
perl -E'*==*",s;;%ENV=~m,..$,,$&+42;e,$==f;$"++for+ab..an;@"=qw,u t,,print+chr;sub f{split}say"@{=} me"'
Ensretted
 2008-10-14 18:49
#115516 #115516
User since
2008-07-23
11 Artikel
BenutzerIn
[default_avatar]
Hi,
yep habe das zuviel gepostet...(hat auch nicht funktioniert)
..du merkst aber auch alles ;-)

Deine Loesung ist auch huebsch...eben nur umgestellt..
..da ich aber von der C-Welt komme, kann ich
for ( @{$HvA{ $type }}) { $ExpStates{$_} = $HvA{$type} }
besser lesen.

Aber danke nochmals.

Gruss Ens
<< >> 5 Einträge, 1 Seite



View all threads created 2008-10-14 17:43.