SL07
SL07

Reputation: 103

Perl- Get Hash Value from Multi level hash

I have a 3 dimension hash that I need to extract the data in it. I need to extract the name and vendor under vuln_soft-> prod. So far, I manage to extract the "cve_id" by using the following code:

foreach my $resultHash_entry (keys %hash){
    my $cve_id = $hash{$resultHash_entry}{'cve_id'};
}

Can someone please provide a solution on how to extract the name and vendor. Thanks in advance.

%hash = {
    'CVE-2015-6929' => {
        'cve_id'    => 'CVE-2015-6929',
        'vuln_soft' => {
            'prod' => {
                'vendor' => 'win',
                'name'   => 'win 8.1',
                'vers'   => {
                    'vers' => '',
                    'num'  => ''
                }
            },            
        'prod' => {
            'vendor' => 'win',
            'name'   => 'win xp',
            'vers'   => {
                'vers' => '',
                'num'  => ''
            }
        }
    },
    'CVE-2015-0616' => {
        'cve_id'    => 'CVE-2015-0616',
        'vuln_soft' => {
            'prod' => {
                'name'   => 'unity_connection',
                'vendor' => 'cisco'
            }
        }
    }
}

Upvotes: 1

Views: 203

Answers (1)

stevieb
stevieb

Reputation: 9296

First, to initialize a hash, you use my %hash = (...); (note the parens, not curly braces). Using {} declares a hash reference, which you have done. You should always use strict; and use warnings;.

To answer the question:

for my $resultHash_entry (keys %hash){
    print "$hash{$resultHash_entry}->{vuln_soft}{prod}{name}\n";
    print "$hash{$resultHash_entry}->{vuln_soft}{prod}{vendor}\n";
}

...which could be slightly simplified to:

for my $resultHash_entry (keys %hash){
    print "$hash{$resultHash_entry}{vuln_soft}{prod}{name}\n";
    print "$hash{$resultHash_entry}{vuln_soft}{prod}{vendor}\n";
}

because Perl always knows for certain that any deeper entries than the first one is always a reference, so the deref operator -> isn't needed here.

Upvotes: 1

Related Questions