Perl-从多级哈希中获取哈希值

时间:2016-04-03 04:50:55

标签: perl loops hash key-value

我有一个3维哈希,我需要在其中提取数据。我需要在vuln_soft->下提取名称和供应商。刺。到目前为止,我设法提取" cve_id"使用以下代码:

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

有人可以提供有关如何提取名称和供应商的解决方案。提前谢谢。

%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'
            }
        }
    }
}

1 个答案:

答案 0 :(得分:1)

首先,要初始化哈希,请使用my %hash = (...);(注意parens,而不是花括号)。使用{}声明您已完成的哈希引用。您应始终use strict;use warnings;

回答这个问题:

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

......可以稍微简化为:

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

因为Perl总是知道任何比第一个更深的条目始终是引用,所以这里不需要deref运算符->