2011-08-26 214 views
2

我正试图访问哈希中的哈希,并通过它循环以获取值。这里是一个数据的例子Perl在哈希中访问哈希,并循环遍历每个哈希以提取值

$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 {ServStat} { 
my ($num, $char, $vs) = (/(\d+)\.(\d+)\.(.+)/); 
if ($num == 1) { 
print {ServStat}->$value 
} 
} 

在此先感谢您的任何建议,您可以提供!

回答

2

要获取密钥,您可以在散列上使用函数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}; 
+0

你并不真正需要的{}除非你提领的东西包含索引,例如,钥匙%{$数据 - > {24.40.53.143} {ServStat}}; – runrig

+0

感谢您抽出时间发表回复。您的解决方案非常有帮助。我确实必须在散列周围使用引号,如下所示:my $ ServStat = $ data - > {'24.40.53.143'} {'ServStat'};再次感谢您的帮助!! – dars33

+1

@dars - “简单”字符串(例如包含字母/数字/下划线)的引号是可选的。所以第一个密钥(IP)需要在'use strict;'下引用,而第二个密钥不能 - 请参阅http://stackoverflow.com/questions/2647425/how-can-i-use-a-perl- hash-key-that-has-a-literal-dot。然而,即使不需要时总是认为总是单引号是好的做法 - 请参阅http://stackoverflow.com/questions/401556/are-quotes-around-hash-keys-a-good-practice-in-perl – DVK