Assoziatives Array: Suchen nach Key<->Value und Value<->Key
Thomas_1234
- perl
0 Multi0 Thomas_12340 Multi
0 Beat
Hallo,
ich kann in Perl bei einem assiozativen Array ja nach dem wert eines keys suchen. Nun brauche ich aber ab und zu beide Richtungen.
Also z.B.:
my %dat = (
'00000' => "A",
'00001' => "F",
'00002' => "R"
);
Ich brauche in meinem Programm einmal welcher Wert zu "00000" gehört, aber auch dass zu "A" eben "00000" gehört.
Der Wert und sowohl der Key sind immer einmalig.
Gibt es für so etwas eine komfortable Lösung ohne zwei Hashes für beide Richtungen anzulegen?
Gruß
Mahlzeit,
Gibt es für so etwas eine komfortable Lösung ohne zwei Hashes für beide Richtungen anzulegen?
Gibt es in Perl ein array_flip, das die Keys und Values vertauscht?
Wenn ja, sollte dir dass weiterhelfen.
Und ich merke grad, wie eingerostet mein Perl ist ....
Gibt es für so etwas eine komfortable Lösung ohne zwei Hashes für beide Richtungen anzulegen?
Gibt es in Perl ein array_flip, das die Keys und Values vertauscht?
Wenn ja, sollte dir dass weiterhelfen.
Ah, das war ein Suchstichwort.
Mittels reverse kann man nicht zur Arrays tauschen, sondern bei Hashes auch die Zuordnung von key<->value drehen.
Allerdings musste ich das dafür jetzt in eine Funktion packen:
my $type = shift;
my %dat = (
'00000' => "A",
'00001' => "F",
'00002' => "R"
);
if ( exists($dat{ $TYPE })) {
$res = $dat{ $TYPE };
return $res;
}
else {
%dat = reverse(%dat);
$res = $dat{ $TYPE };
return $res;
}
Wie performant das Ganze ist, steht natürlich auf einem anderen Blatt. Aber so häufig wird das auch nicht aufgerufen.
Danke
Mahlzeit,
Wie performant das Ganze ist, steht natürlich auf einem anderen Blatt. Aber so häufig wird das auch nicht aufgerufen.
Wenn du Performanceprobleme bekommst, wirst du im ein zweites Hash nicht drumrumkommen.
ich kann in Perl bei einem assiozativen Array ja nach dem wert eines keys suchen. Nun brauche ich aber ab und zu beide Richtungen.
Also z.B.:
my %dat = (
'00000' => "A",
'00001' => "F",
'00002' => "R"
);
>
> Ich brauche in meinem Programm einmal welcher Wert zu "00000" gehört, aber auch dass zu "A" eben "00000" gehört.
>
> Der Wert und sowohl der Key sind immer einmalig.
>
> Gibt es für so etwas eine komfortable Lösung ohne zwei Hashes für beide Richtungen anzulegen?
Das kommt sehr darauf an, was
00000 ... 00002 darstellen (numerisch sortiert?)
und ob A F R ganz einfach Daten der länge von 1 Zeichen sind.
Wäre dem sü so könntest du einerseits ganz einfach eine Stringvariable fragen
$pos = $DATA{'A'}
und
"A" eq substr( $DATA, $pos, 1 ) and print "OK";
Wenn dem nicht so ist, würde ich
einen Array aufbauen
my @RDATA = keys %DATA;
$RDATA[ $DATA{$\_} ] = $\_;
oder einen inversen Hash aufbauen
my %RDATA
foreach( keys %DATA ){
$RDATA{ $DATA{$\_} } = $\_;
}
Braucht aber Speicher.
mfg Beat;
--
Woran ich arbeite:
[X-Torah](http://www.elcappuccino.ch/cgi/tok.pl?extern=1-pub-com3306-1)
><o(((°> ><o(((°>
<°)))o>< ><o(((°>o