Thomas_1234: Assoziatives Array: Suchen nach Key<->Value und Value<->Key

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ß

  1. 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 ....

    1. 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

      1. 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.

  2. 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