in reply to Re: Syntax for Hashes of Hashes
in thread Syntax for Hashes of Hashes

Hey Fire,

Thanks!

Two questions...

1. What if you want to create the inner hash without setting any value to it during its creation? How do you "inform" that it is a hash that is being created?

What is the conditional for seeing if it exists? Is it?

if !($g{$name})
Thanks again...

Tony (o2)

Replies are listed 'Best First'.
Re^3: Syntax for Hashes of Hashes
by hubb0r (Pilgrim) on Jul 24, 2005 at 19:53 UTC
    To define an inner hash without contents, you can do:
    $g{$name} = {};
    to check for existence, you do:
    if ( exists($g{$name} ) { }
    Otherwise, the way you were doing it, you are only checking to see if the value of the key is defined with a true value.

      However be careful with exists(), it creates stuff for you:

      use Data::Dumper; use strict; use warnings; my $h = {}; if (exists($h->{"a"}{"b"})) { } if (exists($h->{"a"})) { print "exists\n"; } print Dumper($h);

      This will make $h->{"a"} exists.

      hubb0r,

      Thanks, man!

      Say, got one more question. I am trying to figure out the syntax for printing out the values of the inner hash OUTSIDE the subroutine.

      Here is as far as I am (I pushed all name values in an array called @names):

      print "From outside the subroutine:\n"; my $i = 0; while ( $i < @names ) { print "$myHash{ $names[$i] }{ name }\n"; $i++; }
      and I have this error:

      Use of uninitialized value in concatenation (.) or string at hashOfHas +hes.pl line 22, <INFO> line 5.
      Line 22 is the print statement within the while loop (figures).

      Thanks again...

      Tony
        Personal preference, but I would write it like:
        foreach my $key (@names) { print $myHash{$key}{'name'}, "\n"; }
        Of course, that would mean that at some point you would have had to assign a hash value with the key 'name' to each nested hash.
Re^3: Syntax for Hashes of Hashes
by pg (Canon) on Jul 24, 2005 at 21:10 UTC

    As a matter of fact there is no need to for you to create inner hash if you don't need it RIGHT AT THE MOMENT. it will be created at the time you want it. For example:

    use Data::Dumper; use strict; use warnings; my $h = {}; $h->{"a"}{"b"}{"c"} = 1; print Dumper($h);

    This works, and there is no need to create level a first, then level b, then assign level c. Level a and b magically come to existance.