2013-04-15 128 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'是不可逆的,所以key - > value和value - > key,因为这些值是相同的(并且会相互覆盖) 。 – TLP

+3

在发布之前,请花些时间让您的问题至少可读。 – sidyll

+2

你真正的问题是什么?你给了我们代码和输出,但没有错误。如果你问的是如何“颠倒数据结构”,你将不得不澄清你的意思。 – RickF

回答

1

你可能不想reverse散列的任何(至少在这个意义上Perl使用该关键字),因为涉及交换键和值。你可能想要做的是改变你的多级哈希键的顺序。

这里是你如何可以互换外两层:

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