【问题标题】:Perl accessing a hash within a hash and looping through each to extract the valuePerl 访问散列中的散列并遍历每个散列以提取值
【发布时间】:2011-08-27 07:23:24
【问题描述】:

我正在尝试访问散列中的散列并循环通过它来获取值。这是数据的示例

$VAR1 = {
      '24.40.53.143' => {
                          'ServStat' => {
                                          '1.18.118.115.95.99.119.98.98.112.109.45.97.112.95.104.116.116.112.115' => 'vs_cgggbpm-ap_https',
                                          '1.17.118.115.95.99.119.98.115.102.97.45.97.112.95.104.116.116.112' => 'vs_cddedsfa-ap_http',
                                          '20.18.118.115.95.99.119.98.116.119.98.45.98.112.95.104.116.116.112.115' => '0',
                                          '19.17.118.115.95.99.119.98.119.115.45.97.112.95.104.116.116.112.115' => '0',
                                          '2.18.118.115.95.99.119.98.116.119.98.45.98.112.95.104.116.116.112.115' => '0',
                                          '24.18.118.115.95.99.119.98.116.119.98.45.97.112.95.104.116.116.112.115' => '0',
                                          '17.17.118.115.95.99.119.98.119.98.45.97.112.95.104.116.116.112.115' => '0',
                                          '29.17.118.115.95.99.119.98.116.119.112.45.98.112.95.104.116.116.112' => '0',  

我想遍历“ServStat”并提取每个值。我将如何引用哈希“ServStat”以便对内容进行 foreach?像这样的:

foreach {ServStat} {
my ( $num, $char, $vs ) = (/(\d+)\.(\d+)\.(.+)/ );
if ($num == 1) { 
print {ServStat}->$value
}
}  

提前感谢您提供的任何建议!

【问题讨论】:

    标签: perl hash


    【解决方案1】:

    要获取密钥,您可以在哈希上使用函数keys。

    my $data = {
          '24.40.53.143' => {
                              'ServStat' => {'1.18.118.115.95.99.119.98.98.112.109.45.97.112.95.104.116.116.112.115' => 'vs_cgggbpm-ap_https'}
          }
    };
    
    
    my $ServStat = $data->{24.40.53.143}{ServStat};
    
    foreach my $key (keys %{$ServStat}) { # you need the {} to dereference as $ServStat is a hash reference
     ...#Now, in $key, you have the key 1.18.118.115.95.99.119.98.98.112.109.45.97.112.95.104.116.116.112.115
    
    }  
    

    如果您只想要所有值,只需在哈希上使用函数values

    my @values = values %{$ServStat};
    

    【讨论】:

    • 除非您要取消引用的内容包含索引,否则您实际上并不需要 {},例如,键 %{$data->{24.40.53.143}{ServStat}};
    • 感谢您抽出时间回复。您的解决方案非常有帮助。我确实必须在哈希周围使用引号,如下所示:my $ServStat = $data->{'24.40.53.143'}{'ServStat'};再次感谢您的帮助!
    • @dars - 引号在“简单”字符串周围是可选的(例如,包含字母/数字/下划线)。因此,第一个密钥 (IP) 需要在 use strict; 下引用,而第二个则不需要 - 请参阅 stackoverflow.com/questions/2647425/… 。但是,即使在不需要的情况下,也总是使用单引号通常被认为是一种好习惯 - 请参阅 stackoverflow.com/questions/401556/…
    猜你喜欢
    • 2012-08-03
    • 1970-01-01
    • 2016-08-03
    • 2013-08-11
    • 2018-12-07
    • 2018-06-29
    • 2014-05-19
    • 1970-01-01
    • 2010-09-14
    相关资源
    最近更新 更多