2013-04-15 4 views
-1

JSON 데이터를 해독하여이 결과를 얻었습니다.Perl에서 해시의 역 해시

이제이 데이터 구조를 바꾸고 Perl을 사용하여 인쇄하려고합니다.

누구든지 아래의 코드 스 니펫을 사용하여 도움을받을 수 있습니까?

이 변수를 한 변수에 넣었습니다.

$VAR1 = { 
    'Packet Loss to Source' => { 
     '142' => { 
      '161' => '0.000', 
      '162' => '0.000', 
      '141' => '0.000' 
     } 
    }, 
    'Packet Loss to Destination' => { 
     '142' => { 
      '161' => '0.000', 
      '162' => '0.000', 
      '141' => '0.000' 
     } 
    }, 
    'Average Jitter to Source' => { 
     '142' => { 
      '161' => '13.323', 
      '162' => '37.003', 
      '141' => '192.309' 
     } 
    }, 
    'Availability' => { 
     '142' => { 
      '161' => '0.000', 
      '162' => '0.000', 
      '141' => '1.042' 
     } 
    }, 
    'Average Round Trip Time' => { 
     '142' => { 
      '161' => '772.278', 
      '162' => '389.566', 
      '141' => '8557.511' 
     } 
    }, 
    'Average Jitter to Destination' => { 

     '142' => { 
      '161' => '13.323', 
      '162' => '37.003', 
      '141' => '192.309' 
     } 
    } 
}; 

이 내가 출력을 얻기 위해 노력하는 코드입니다 : 내 출력은 내가 다음과 같습니다 해시의 해시를

아래에 표시됩니다. 텍스트 파일을 읽고 JSON 데이터를 얻은 다음 디코드하여 인쇄합니다. 위의 결과는 변수 $perl_obj에 있습니다. 즉 교환 키와 값을 포함하기 때문에

#my $dirname = "/home/brix/ravikiran/doc/demo.txt"; 
my $dirname = "/home/brix/ravikiran/doc/JSONData.txt"; 

open HANDLE, $dirname; 
my @raw_data = <HANDLE>; 
my $json_text; 
foreach my $row (@raw_data) { 
    $json_text .= $row; 
} 
close(HANDLE); 

print "$json_text;\n"; 
my $json = JSON::XS->new(); 
$json = json->pretty(1)-> 
    space_before(1)-> 
    space_after(1)-> 
    canonical(1)-> 
    allow_blessed(1)-> 
    convert_blessed(1); 

my $perl_obj = $json->decode($json_text); 
print STDOUT Dumper($perl_obj); 
+4

뜻 여기

는 외부 두 레이어를 교환 할 수있는 방법입니다 "역"? '161'=> '0.000', '162'=> '0.000'은 키 -> 값, 값 -> 키이므로 값이 동일하고 서로 겹치기 때문에 되돌릴 수 없다는 것을 알고 있습니다. . – TLP

+3

게시하기 전에 적어도 읽을 수있는 수준으로 질문을 만드십시오. – sidyll

+2

실제 질문은 무엇입니까? 코드 및 출력을 제공했지만 오류는 없습니다. '데이터 구조를 뒤집는 방법'을 묻는다면, 그 의미를 명확히해야 할 것입니다. – RickF

답변

1

당신은 아마 해시의 reverse 어떤을하지 않으려는 경우 (적어도 의미에서 펄은 해당 키워드를 사용합니다). 다단계 해시에서 키 순서를 변경하는 것이 좋습니다.

use warnings; 
use strict; 

my $new_obj; 
foreach my $outer_key (keys %$perl_obj) 
{ 
    foreach my $inner_key (keys %{$perl_obj->{$outer_key}}) 
    { 
     $new_obj->{$inner_key}->{$outer_key} = 
      $perl_obj->{$outer_key}->{$inner_key}; 
    } 
} 

use Data::Dumper; 
print Dumper $new_obj; 

출력 :

$VAR1 = { 
      '142' => { 
        'Packet Loss to Source' => { 
                '161' => '0.000', 
                '162' => '0.000', 
                '141' => '0.000' 
               }, 
        'Packet Loss to Destination' => { 
                 '161' => '0.000', 
                 '162' => '0.000', 
                 '141' => '0.000' 
                }, 
      ...etc... 

당신은 완전히 이런 식으로 반전 수 : 당신은 무엇을

my $new_obj; 
foreach my $outer_key (keys %$perl_obj) 
{ 
    foreach my $inner_key (keys %{$perl_obj->{$outer_key}}) 
    { 
     foreach my $innest_key (keys %{$perl_obj->{$outer_key}->{$inner_key}}) 
     { 
      $new_obj->{$innest_key}->{$inner_key}->{$outer_key} = 
       $perl_obj->{$outer_key}->{$inner_key}->{$innest_key}; 
     } 
    } 
} 

use Data::Dumper; 
print Dumper $new_obj; 
+0

고마워요. 작동합니다. – ravikiran