http://qs1969.pair.com?node_id=677494

Dru has asked for the wisdom of the Perl Monks concerning the following question:

Esteemed Monks,

I am a big fan of this data structure, but I am ashamed to admit I am not even sure what it is called. I know it is some form of hash (obviously), but I have been pouring over the perldocs, especially perldsc, to try and finally figure out it's name, but I have finally admitted defeat. It appears to be a simple hash, but the key linking it to {$ip} is what is confusing me.

I would also like to know if it is possible to add a new key/value pair to the existing hash without having to create a new one, which is what I did to get the results I was after.

This is my existing data structure:
$hashIPs{$ip} = { totalVulns => $ipTotalVulns, vulns => $vulns };
and later in my code, I would like to add:
region => $region
I was able to accomplish what I wanted with the following, but for curiosity's sake, I would like to know if I could have avoided having to create the 2nd hash.
my $hashIPs{$ip} = { totalVulns => $ipTotalVulns, vulns => $vulns }; my $hashrefIPs = \%hashIPs; my $hashIPsNew{$ip} = { region => $region, totalVulns => ${$hashrefIPs}{$ip}{totalVulns}, vulns => ${$hashrefIPs}{$ip}{vulns} }; for my $ip (keys %hashIPsNew){ print "$ip -- $hashIPsNew{$ip}{region} -- $hashIPsNew{$ip}{totalVulns} + -- $hashIPsNew{$ip}{vulns}\n"; }
Thanks,
Dru

Perl, the Leatherman of Programming languages. - qazwart

Replies are listed 'Best First'.
Re: Mystery (to me) Data Structure
by moritz (Cardinal) on Mar 31, 2008 at 10:53 UTC
    but I am ashamed to admit I am not even sure what it is called

    In this case it's a hash of hashes, or just "nested hashes".

    But when data structures grow more complicated it doesn't make sense to invent ever more complicated names for them. Usually a Data::Dumper output of an example data structure explains its structure.

      In this case it's a hash of hashes, or just "nested hashes".

      Thanks, a HoH is what I thought it was, but it didn't quite resemble the the HoH definition in perldsc so it threw me for a loop, but now I realize they are initializing the hash while I am adding elements to it.

      Thanks,
      Dru

      Perl, the Leatherman of Programming languages. - qazwart
Re: Mystery (to me) Data Structure
by poolpi (Hermit) on Mar 31, 2008 at 10:42 UTC
    my $hashIPs = {}; $hashIPs->{$ip} = { totalVulns => $ipTotalVulns, vulns => $vulns }; + $hashIPs->{$ip}->{'region'} = $region;

    hth,
    PooLpi

    Update:

    Or without references : my %hashIPs; $hashIPs{$ip} = { totalVulns => $ipTotalVulns, vulns => $vulns }; $hashIPs{$ip}{'region'} = $region;
    'Ebry haffa hoe hab im tik a bush'. Jamaican proverb

      Clarification: $hashIPs{$ip}{'region'} = $region; is still using references. It's just that the arrow operator is optional between bracket subscripts, according to perlref.

      Julio

      Update: And this is really nice when working with arrays of arrays, since they are then used as multidimensional arrays: $array_ref->[$x][$y] or $array[$x][$y].