2011-08-26 3 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'을 통해 반복하고 각 값을 추출하고 싶습니다. 어떻게 내용을 foreach 할 수 있도록 해시 '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

당신은 정말 필요하지 않은 {} 당신이 역 참조하고있는 것은 인덱스, 예를 들어, 키를 포함하지 않는 % {$ data -> {24.40.53.143} {ServStat}}; – runrig

+0

회신을 보내 주셔서 감사합니다. 귀하의 솔루션은 매우 도움이되었습니다. 나는 다음과 같이 해시를 따옴표로 묶어야했다. $ 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-a-literal-dot을 사용합니다. 그러나 불필요한 경우에도 항상 작은 따옴표를 사용하는 것이 좋습니다. http://stackoverflow.com/questions/401556/are-quotes-around-hash-keys-a-good-practice-in-perl을 참조하십시오. – DVK

관련 문제