Silvio: Probleme bei exists-Abfrage in einem Hash

Hallo,

Ich möchte mit folgendem Code prüfen, ob in einem Hash ein Key vorhanden/ gesetzt ist.

use Data::Dumper;
my %itemSet;
print "Dump vor exists-Abfrage: " . Dumper(%itemSet) . "\n\n";
if (exists $itemSet{'item'}{'imageSet'}{1}{'large'} ) {print "'large' ist vorhanden\n\n";}
print "Dump nach exists-Abfrage: " . Dumper(%itemSet) . "\n\n";

Im Ergebnis erhalte ich

Dump vor exists-Abfrage:

Dump nach exists-Abfrage: $VAR1 = 'item'; $VAR2 = { 'imageSet' => { '1' => {} } };

Was ich nicht verstehe ist, warum %itemSet nach der exists-Abfrage auf einmal gefüllt ist?

Und kann ich das verhindern?

Danke!

  1. Hallo Silvio,

    use Data::Dumper;
    my %itemSet;
    print "Dump vor exists-Abfrage: " . Dumper(%itemSet) . "\n\n";
    if (exists $itemSet{'item'}{'imageSet'}{1}{'large'} ) {print "'large' ist vorhanden\n\n";}
    print "Dump nach exists-Abfrage: " . Dumper(%itemSet) . "\n\n";
    

    Dump vor exists-Abfrage:

    Dump nach exists-Abfrage: $VAR1 = 'item'; $VAR2 = { 'imageSet' => { '1' => {} } };

    Was ich nicht verstehe ist, warum %itemSet nach der exists-Abfrage auf einmal gefüllt ist?

    Um zu prüfen, ob der letzte Schlüssel large existiert, werden die davor liegenden Hash of Hashes angelegt.

    Und kann ich das verhindern?

    Mehrstufig prüfen, d.h. auf den Zwischenebenen schauen, ob diese existieren.

    Viele Grüße
    Robert

    1. Ok, vielen Dank.

      Ich hätte ja erwartet, dass die Prüfung schon abbricht, wenn der erste Schlüssel nicht vorhanden ist. Denn dann können die folgenden ja sowieso nicht da sein?!

      1. Hallo Silvio,

        laut der Perl-Doku zu exists wird nur geprüft, ob der letzte Teil existiert. Um das herauszufinden muss Perl allerdings in deinem Fall den Rest vorher anlegen.

        Viele Grüße
        Robert