in reply to "A meditation on Hashes", or "Why i need more aspirin"

I think one of the potentially more confusing parts for newcomers is understanding how hash references autovivify. For example:

use strict; use warnings; local $\ = "\n"; my %hash; print '$hash{a} ', ( $hash{a} ) ? "true" : "not true +"; print '$hash{a} ', ( defined $hash{a} ) ? "defined" : "not defi +ned"; print '$hash{a} ', ( exists $hash{a} ) ? "exists" : "doesn't +exist"; print ""; print '$hash{a}{b} ', ( $hash{a}{b} ) ? "true" : "not true +"; print '$hash{a}{b} ', ( defined $hash{a}{b} ) ? "defined" : "not defi +ned"; print '$hash{a}{b} ', ( exists $hash{a}{b} ) ? "exists" : "doesn't +exist"; print ""; print '$hash{a} ', ( $hash{a} ) ? "true" : "not true +"; print '$hash{a} ', ( defined $hash{a} ) ? "defined" : "not defi +ned"; print '$hash{a} ', ( exists $hash{a} ) ? "exists" : "doesn't +exist";

Prints:

$hash{a} not true $hash{a} not defined $hash{a} doesn't exist $hash{a}{b} not true $hash{a}{b} not defined $hash{a}{b} doesn't exist $hash{a} true $hash{a} defined $hash{a} exists

Checking for $hash{a}{b} causes $hash{a} to suddenly contain the reference to an anonymous hash that is checked for the 'b'.

-xdg

Code written by xdg and posted on PerlMonks is public domain. It is provided as is with no warranties, express or implied, of any kind. Posted code may not have been tested. Use of posted code is at your own risk.

Replies are listed 'Best First'.
Re^2: "A meditation on Hashes", or "Why i need more aspirin"
by jdhedden (Deacon) on Jun 16, 2006 at 00:54 UTC
    Checking for $hash{a}{b} causes $hash{a} to suddenly contain the reference to an anonymous hash that is checked for the 'b'.
    And the exception to this is when using threads::shared:
    Taking references to the elements of shared arrays and hashes does not autovivify the elements, and neither does slicing a shared array/hash over non-existent indices/keys autovivify the elements.
    Thus, the following results in a runtime error:
    use strict; use warnings; use threads; use threads::shared; my %hash :shared; print '$hash{a}{b} ', ( exists $hash{a}{b} ) ? "exists" : "doesn't ex +ist";

    Remember: There's always one more bug.