in reply to hash surprise

Interesting. To quote the good Camel on exists:

The function returns true if the specified hash key or array index exists in its hash or array. It doesn't matter whether the corresponding value is true or false, or whether the value is even defined.
if (exists %hash{A}{B}{$key}) { ... }
Although the last element will not spring into existence just because its existence was tested, intervening ones will. Thus $$hash{"A"} and $hash{"A"}->{"B"} will both spring into existence. This is not a function of exists, per se; it happens anywhere the arrow operator is used (explicitly or implicitly).

Also, you want to wrap your code in <code>...</code> tags. That'll work fine.


_______________
D a m n D i r t y A p e
Home Node | Email

Replies are listed 'Best First'.
possible fix for: hash surprise
by smackdab (Pilgrim) on Jul 04, 2002 at 06:28 UTC
    You left out the best part from the doc ;-)

    "This surprising autovivification in what does not at first--or even second--glance appear to be an lvalue context may be fixed in a future release." (empasis added)

    I think the hash key gets a value of "", can't see how that is good...

    Most of my hashes are balanced. By that I mean that I always fill all branches, but don't always define a leaf.

    So, this example seems to be a work around...at least for my purpose:

    use strict; my $self = {}; my $f1 = "aaa"; my $f2 = "bbb"; my $f3 = "CCC"; my $val = "val1"; # Create another valid branch $self->{$f1}{$f2}{DDD} = 'val2'; # Looking to test for: $self->{$f1}{$f2}{$f3} = val1 # But DON'T want to create anything if it isn't created print "pre count = ".%$self."\n"; print "found\n" if (defined $self->{$f1} && defined $self->{$f1}{$f2} + && defined $self->{$f1}{$f2}{$f3}); print "post count = ".%$self."\n";