2016-03-22 77 views
3

我有一个从json检索的散列的散列,我试图拼凑散列,组和打印值。也就是说,对于每个key1组中的所有键和相应的值。试图使用下面的代码在perl中实现这一点,但是它打印每个ID和名称的个别值,但不是分组值。你能帮我怎么分组和打印键和值。散列的perl散列 - 对于eacy键组的内部键和相应的值

数据:

VAR1= { 
     'ID1' => {'Name1' => {'Address1' => {'Mod1' => ['pol1']}}, 
        Name2' => {'Address1' => {'Mod2' => ['pol2']}}}, 
     'ID2' => {'Name3' => {'Address3' => {'Mod3' => ['pol3']}}}, 
     'ID3' => {'Name4' => {'Address4' => {'Mod4' => ['pol1, pol2, pol3']}}} 
} 

预期输出:

ID1 => [Name1,Address1,mod1(pol1), Name2,Address1,mod2(pol2)], 
ID2 => [Name3,Address3,mod3(pol3)], 
ID3 => [Name4,Address4,mod4(pol1,pol2,pol3)] 

代码1:

for my $id (@id_list) { 
    foreach my $item (sort (slurp(\%{$new{$id}}))) { 
    my $data = join(',', @$item); 
    print "data.. $data\n"; 
    push(@results,$data); 
    } 
} 

print map {"$_"} @results; 

代码2:

foreach my $id (sort keys %new){ 
    foreach my $name (keys %{$new{$id} }) { 
     foreach my $address (keys %{$new{$id}{$name}}) { 
     foreach my $mod (keys %{$new{$id}{$name}{$address}) { 
      foreach my $value (@{$new{$id}{$name}{$address}{$mod}}) { 
       my $sp = ":"; 
       my $reasons = join(',',$id,$name,$address,$mod,$value.$sp); 
       push (@rea, $reasons); 
      } 
     } 
     } 
    } 
} 
+0

你能澄清你的预期产出吗?你看起来像一个散列,键是原始的顶级键和值是数组引用 - 但“_mod(pol)_”不适合。 – zdim

+0

@zdim,如果我理解正确,你说mod(pol)不是关键和价值。是的,你是正确的,它是一套顶级的关键和值列表。我的$值((@ {$ new {$ id} {$ name} {$ address} {$ mod}})正在返回相应“mod”的期望“pol”值 – Sampath

+0

您的第二个代码几乎是正确的 - 它在'$ mod'循环中缺少'}',并且它没有在最内层循环中汇编所有数组值。如果你想要一个带有array-ref的散列值,那么究竟是什么“_mod1(pol1)_” ?这是否意味着是一个含有该内容的字符串,''mod1(pol1)''?写入的内容不是有效的Perl – zdim

回答

1

有了这样一个嵌套结构,你想要系统地进行,就像在你的“Code2”中一样。

use warnings; 
use strict; 
use feature qw(say); 

my %id_list = ( 
    ID1 => { 
     Name1 => {'Address1' => {'Mod1' => ['pol1']}}, 
     Name2 => {'Address1' => {'Mod2' => ['pol2']}} 
    }, 
    ID2 => { 'Name3' => {'Address3' => {'Mod3' => ['pol3']}} }, 
    ID3 => { 'Name4' => {'Address4' => {'Mod4' => ['pol1, pol2, pol3']}} } 
); 

my (%flattened, @ar, $modvals); 
foreach my $id (sort keys %id_list){ 
    foreach my $name (keys %{$id_list{$id} }) { 
     foreach my $address (keys %{$id_list{$id}{$name}}) { 
      foreach my $mod (keys %{$id_list{$id}{$name}{$address}}) { 
       $modvals = "$mod(" . 
        join(',', @{$id_list{$id}{$name}{$address}{$mod}}) 
        . ')'; 
       $modvals =~ s/,$//; # strip the last comma 
       push @ar, $name, $address, $modvals; 
      } 
     } 
    } 
    $flattened{$id} = [ @ar ]; 
    @ar =(); 
} 

say "$_ => @{$h{$_}}" for sort keys %flattened; 

输出

 
ID1 => Name1 Address1 Mod1(pol1) Name2 Address1 Mod2(pol2) 
ID2 => Name3 Address3 Mod3(pol3) 
ID3 => Name4 Address4 Mod4(pol1, pol2, pol3) 

这生成mod3作为(pol1, ...)字符串 - 如在给定的输入,作为一个单一。如果输入的内容被锁定为pol的列表,则pol之间的空格将不再输出。

id键和阵列参考与相应的条目生成散列。

+0

谢谢你分享的细节。如果我把你弄糊涂的话,谢谢。输出未按“名称”级别分组。预期输出:ID1 => [Name1,Address1,Mod1(pol1),Name2,Address1,Mod2(pol2)] ID2 => [Name3,Address3,Mod3(pol3)] ID3 => [Name4,Address4,Mod4 ,pol2,pol3)] – Sampath

+0

还没有分组。例如,ID1具有name1和name2作为以pol1和pol2为值的唯一值。输出应该是ID1 => [Name1,Address1,Mod1(pol1),Name2,Address1,Mod2(pol2)] – Sampath

+0

,请告诉我是否缺少有关预期输出的任何信息。 – Sampath