alex: Hash

OK

Ich habe einen hash initialisiert und möchte nun prüfen, ob ein schlüssel einen ganz bestimmten wert hat.

if (exists $hash{$schlüssel, $wert}) {do\_something();}  
else { error1(); exit;}  

funktioniert leider nicht, obwohl der schlüssel vorhanden ist und der wert stimmen sollte...

gibt es eine andere lösung?

  1. also.. ich bin gerade etwas übermüdet, keine garantie für richtigkeit, aber das sieht so leicht aus, da kann ich mir eine antwort nicht verkneifen...
    was spricht gegen
    if ( $hash{$schluessel} == $wert }
    ? ( == gegebenenfalls durch eq ersetzen )
    ich muss zugeben, dass ich noch nie etwas von exists gehört habe...
    so, hab gerade nachgeblättert. exists() schaut also, ob es den entsprechenden schlüssel im hash überhaupt gibt.
    aber ob das einen wert hat oder nicht ist da ja völlig schnuppe...
    also wenn du wissen willst, ob schüssel "test" den wert "3" hat, dann ist exists sicher der falsche weg.
    machs dann so wie oben.
    wenn du doch irgendetwas anderes wolltest, habe ich dich wohl falsch verstanden.

    danny

    Ich habe einen hash initialisiert und möchte nun prüfen, ob ein schlüssel einen ganz bestimmten wert hat.

    »»  if (exists $hash{$schlüssel, $wert}) {do_something();}
    »»  else { error1(); exit;}

    funktioniert leider nicht, obwohl der schlüssel vorhanden ist und der wert stimmen sollte...

    gibt es eine andere lösung?

    1. Hi Danny!

      was spricht gegen
      if ( $hash{$schluessel} == $wert }
      ? ( == gegebenenfalls durch eq ersetzen )

      Ganz recht, jedoch erwaehnte alex ja explizit die Moeglichkeit, dass es einen Schluessel gar nicht gibt. Wenn Du dann direkt obiges ausfuehrst, kann das Warnungen produzieren (wenn -w aktiv ist, was es immer sollte). Daher besser auch pruefen, ob der Schluessel existiert *und* einen Wert hat:
        if (exists($hash{$schluessel}) && defined($hash{$schluessel}) && $hash{$schluessel} == $wert) { }
      Da defined nur zutreffen kann, wenn auch exists zutrifft (d.h. exists gibt entweder sowieso true, oder defined ergibt *auch* false), kann man exists hier auch weglassen, wodurch sich das vereinfacht auf:
        if (defined($hash{$schluessel}) && $hash{$schluessel} == $wert) { }

      Siehe auch: perldoc -f exists

      So long

      1. Hi,

        dazu muss ich sagen, dass ich hier lieber ein paar zeichen sparen und dafür eine warnung in kauf nehmen würde :)
        ausserdem, warum nicht so?
        if ( $hash{$schlüssel} && $hash{$schlüssel} == $wert )
        ?
        oder gibt das auch eine warnung?
        jedenfalls kann man die warnung ja schön misachten, da die wohl nur dazu da sein soll, mögliche tippfehler zu verhindern denke ich mal.
        diese kleinkrämerei ist ja eh sinnlos. aber manchmal macht das halt spaß ;)

        danny

        1. Hallo,

          warum nicht so?
          if ( $hash{$schlüssel} && $hash{$schlüssel} == $wert )
          ?

          weil das nicht funktionieren würde, wenn $wert 0 sein kann.

          Grüße
            Klaus

        2. Hi again!

          jedenfalls kann man die warnung ja schön misachten, da die wohl nur dazu da sein soll, mögliche tippfehler zu verhindern denke ich mal.

          Auch dafuer sind Warnungen da, aber nicht ausschliesslich.

          Du kannst zwar die Warnungen uebergehen, wenn Du weisst, dass sie nicht schlimm sind, wenn Du das aber oefter machst und dann in diversen Modulen und Schleifen solche Stellen hast, die staendig Warnungen erzeugen, wirst Du schnell eine Latte von 1000 solchen Meldungen haben, und wenn dann eine wichtige dabei ist, wirst Du die uebersehen.

          So long