【问题标题】:Perl- Get Hash Value from Multi level hashPerl-从多级哈希中获取哈希值
【发布时间】:2016-07-22 18:13:46
【问题描述】:

我有一个 3 维散列,我需要从中提取数据。我需要在 vuln_soft-> prod 下提取名称和供应商。到目前为止,我设法使用以下代码提取“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'
            }
        }
    }
}

【问题讨论】:

  • 您能粘贴您的实际数据吗?你显示的有 } 没有对应的 {
  • 实际数据超过1K行。我会尝试在问题字段中修复它。
  • 要从多维哈希中提取数据,请使用这种语法:perl -E '%h=(a=>{b=>1});说 $h{a}{b}'。另见perldsc
  • 这个哈希是从哪里来的。这看起来很可疑,就像您使用 XML::Simple 解析了 XML
  • my $name = $hash{$resultHash_entry}{vuln_soft}{prod}{name}

标签: perl loops hash key-value


【解决方案1】:

首先,要初始化散列,您使用my %hash = (...);(注意括号,而不是花括号)。使用{} 声明了一个哈希引用,您已经这样做了。你应该总是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 运算符->

【讨论】:

  • 我想了解您为什么显示带有间接箭头的版本?
  • 只是显示引用的开始位置。如果它有损答案,我可以删除它
  • 不,没关系——我只是想了解你的想法
  • 感谢您的解决方案。但是,只有在 vuln_soft 下有一个 prod 时,您的解决方案才有效。如果您有多个 prod,则会导致错误 Not a hash reference。
  • 在 vuln_soft 下你不能有多个 prod;哈希键必须是唯一的。您需要举例说明您的意思
猜你喜欢
  • 1970-01-01
  • 2010-10-20
  • 2010-12-19
  • 1970-01-01
  • 2021-12-30
  • 2013-09-24
  • 1970-01-01
  • 2013-06-06
相关资源
最近更新 更多