2016-03-22 7 views
3

Json'dan alınan karmaların bir hash'ım var ve karma, grup ve baskı değerlerini düzleştirmeye çalışıyorum. Yani, her bir anahtar1 grubu için tüm tuşlar ve ilgili değerler. Aşağıdaki kodu kullanarak perlde bunu elde etmek için çalışıyorum, ancak her bir ID ve isimleri tek tek değerlerle değil, gruplanmış değerleri basıyor. Anahtarları ve değerleri nasıl gruplandıracağımı ve yazdıracağım konusunda bana yardım edebilir misiniz?hashların perl hash değeri - dolandırıcılı anahtar grubu iç anahtarları ve ilgili değerler için

veri:

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

Beklenen Çıktı:

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

Kod1:

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; 

kodu2:

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

Beklenen çıktınızı açıklayabilir misiniz? Yaptığınız şey bir karma gibi görünüyor, tuşlar orijinal üst düzey anahtarlar ve dizi-referanslar olmakla birlikte - ama "_mod (pol) _" buna uymuyor. – zdim

+0

@zdim, Eğer doğru anlarsam, modun (pol) anahtar ve değer olmadığını söylüyorsunuz. evet doğru, üst düzey anahtarlardan oluşur ve değerler listedir. benim $ değerinim ((@ {$ new {$ id} {$ name} {$ address} {$ mod}}) ilgili "mod" un beklenen "pol" değerini döndürüyor. – Sampath

+0

İkinci kodunuz neredeyse doğru - '$' 'döngüsünde bir' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' 'dır. Bu içeriğe sahip bir dize olması gerekiyordu, '' mod1 (pol1) ''? Ne yazılır geçerli değil Perl. – zdim

cevap

1

Böyle iç içe geçmiş bir yapı ile sistematik olarak gitmek istediğiniz gibi, "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; 

Çıkış

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

Bu mod3(pol1, ...) olarak dizesi üretir - bir tek dize olarak verilen giriş olarak. Bu, girişte pol listesine yönlendirilirse, pol 'ler arasındaki boşluklar çıkacaktır.

id anahtarlı bir hash ve ilgili girişlerle dizi ref oluşturulur.

+0

Ayrıntıları paylaştığınız için teşekkür ederiz. Kafamı karıştırırsam seni. Çıkış "isim" düzeyinde gruplandırılmamış. Beklenen çıktı: ID1 => [Ad1, Adres1, Mod1 (pol1), Ad2, Adres1, Mod2 (pol2)] ID2 => [Ad3, Adres3, Mod3 (pol3)] ID3 => [Name4, Adres4, Mod4 (pol1) , pol2, pol3)] – Sampath

+0

hayır hala gruplandırılmamış. Örneğin, ID1'in, ad1 ve ad 2, değerler olarak pol1 ve pol2 ile benzersiz değerleri olduğunu varsayalım. Çıkış ID1 => [Ad1, Adres1, Mod1 (Pol1), Name2, Adres1, Mod2 (pol2)] – Sampath

+0

olmalıdır, lütfen beklenen çıktı hakkında herhangi bir bilgi eksikse lütfen bana bildirin. – Sampath

İlgili konular