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 любого хешей (по крайней мере, в том смысле, 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

Смежные вопросы