Обратный хеш хэшей в Perl
Я получил этот вывод путем декодирования данных JSON.
Теперь я хочу перевернуть эту структуру данных и распечатать ее с помощью 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);
1 ответ
Вы, вероятно, не хотите менять ни один из хэшей (по крайней мере, в том смысле, в котором 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;