繁体   English   中英

如何在Perl中访问哈希数组中的哈希

[英]How to access Hash in Array of Hashes in Perl

我相信自己是引用哈希数组的哈希。 我想了解的是如何访问此哈希数组中的哈希元素。

编辑:这是完整的哈希结构

$VAR1 = {
      'CVE-2015-0677' => {
                         'vuln:references' => [
                                              {
                                                'attr' => {
                                                            'reference_type' => 'VENDOR_ADVISORY',
                                                            'xml:lang' => 'en'
                                                          },
                                                'vuln:source' => 'CISCO',
                                                'vuln:reference' => [
                                                                    {
                                                                      'attr' => {
                                                                                  'href' => 'http://tools.cisco.com/security/center/content/CiscoSecurityAdvisory/cisco-sa-20150408-asa',
                                                                                  'xml:lang' => 'en'
                                                                                }
                                                                    }
                                                                  ]
                                              }
                                            ],
                         'vuln:published-datetime' => '2015-04-12T21:59:03.033-04:00',
                         'vuln:last-modified-datetime' => '2015-04-13T17:45:18.310-04:00',
                         'vuln:vulnerable-software-list' => [
                                                              'cpe:/o:cisco:adaptive_security_appliance_software:9.0.3',
                                                              'cpe:/o:cisco:adaptive_security_appliance_software:8.4.5',
                                                            ],
                         'vuln:summary' => 'The XML parser in Cisco Adaptive Security Appliance (ASA) Software 8.4 before 8.4(7.28), 8.6 before 8.6(1.17), 9.0 before 9.0(4.33), 9.1 before 9.1(6), 9.2 before 9.2(3.4), and 9.3 before 9.3(3), when Clientless SSL VPN, AnyConnect SSL VPN, or AnyConnect IKEv2 VPN is used, allows remote attackers to cause a denial of service (VPN outage or device reload) via a crafted XML document, aka Bug ID CSCus95290.'
                       }
    };

如果我尝试以下操作,则第一个Data :: Dumper输出的输出与第二个相同。

for my $key ( keys $hash ) {
 my @references =  $hash->{$key}{'vuln:references'};
 print Dumper(@references);  #1
  for my $vulnref (@references) {
    print Dumper($vulnref); #2
  }
}

#1
$VAR1 = [
       {
         'vuln:reference' => 'VENDOR',
         'vuln:source' => 'CISCO',
        }
        ];

#2  
$VAR1 = [
      {
        'vuln:reference' => 'VENDOR',
        'vuln:source' => 'CISCO',

      }
    ];

所以我的for循环似乎没有任何影响?

但是,如果我循环两次,则第二次循环

for my $key ( keys $hash ) {
  my @references =  $hash->{$key}{'vuln:references'};
  print Dumper(@references); #1
  for my $vulnref (@references) {
    for my $vuln ($vulnref) {
       print Dumper($vuln);  #2
    }
   }
}


#1 
$VAR1 = [
       {
        'vuln:reference' => 'VENDOR',
        'vuln:source' => 'CISCO',

      }
    ];

#2
$VAR1 = {
       'vuln:reference' => 'VENDOR',
       'vuln:source' => 'CISCO', 
    };

我现在似乎正在访问哈希。

我相信这里缺少基本的东西。

非常感谢。

您不会显示哈希的最高级别。 您显示的$VAR1$VAR1 $hash->{key} ,但我无法确定可能是什么key

无论如何,利用我所拥有的,

  • $hash->{key} vuln:references $hash->{key}是对具有单个元素且键为vuln:references哈希的 vuln:references

  • $hash->{key}{'vuln:references'}是对单个元素的索引为零的数组的引用

  • $hash->{key}{'vuln:references'}[0]是对另一个哈希的引用,这次有两个元素

您没有说要使用此数据做什么,但看起来您所需要做的就是

my $data = $hash->{key}{'vuln:references'}[0];

for my $key (keys %$data) {
  printf "%s => %s\n", $key, $data->{$key};
}

产量

vuln:source => CISCO
vuln:reference => VENDOR

更新

您没有说$key是如何定义的,但是在

for my $data ( $hash->{$key}{'vuln:references'} ) { ... }

您编写了一个循环,该循环执行一次 ,将$data设置为我上面描述的数组引用。

要遍历整个结构,假设$hash hash引用的最外层哈希和内部数组是唯一包含多个元素的层,则可以编写

for my $cve ( keys %$hash ) {
  my $refs = $hash->{$cve}{'vuln:references'};
  print $cve, " \n";
  for my $ref ( @$refs ) {
    printf "  %s => %s\n", $_, $ref->{$_} for keys %$ref;
    print "\n";
  }
}

注意在keys %$hash@$refs%$ref中对结构的取消引用 在更新版本的Perl中,可以使用keys $hash而不进行取消引用,但这是一项实验性功能,不应在实时代码中使用,并且如果在适当的地方use warnings了警告,则将产生警告消息(共同)在程序顶部use strict

至于为什么您的代码两次转储相同的值,您有

my @references = $hash->{$key}{'vuln:references'};

它将数组@references为保留一个元素 ,该元素是此时哈希中的数组引用。 然后

print Dumper(@references);

逐一转储数组的每个元素。 因为只有一个元素,所以它仅输出一个转储。 最后

for my $vulnref (@references) {
  for my $vuln ($vulnref) {
    print Dumper($vuln);
  }
}

设置$vulnref到的每个元素@references 因为只有一个循环执行一次,而$vulnref设置为数组引用。 然后,将$vuln设置为列表的每个元素( $vulnref )以便它获取同一引用的另一个副本。 最后,该值被转储,结果显示了与以前相同的数组引用。

请记住,Perl标量值以$开头; 即使是数组的元素也是$array[0] ,即使该值是引用,也将其视为单个值 如果要访问其引用的数据,则必须使用适当的符号对其进行取消引用

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM