2011-08-26 56 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