2015-06-04 20 views
2

我有一個哈希值是多層次的哈希我想那轉化爲單級。但我不能夠做到這一點轉換多散在簡單的哈希在Perl

實際哈希:

'MainSlab' => { 
       'A1' => { 
          'Slab' => { 
            '49_168' => { 
                'Amt' => '3000', 
                'Start' => '49', 
                'End' => '168' 
               }, 
            '169_720' => { 
                'Amt' => '3000', 
                'Start' => '169', 
                'End' => '720' 
                }, 
            '2_48' => { 
               'Amt' => '3000', 
               'Start' => '2', 
               'End' => '48' 
               }, 
            '721_-' => { 
                'Amt' => '3000', 
                'Start' => '721', 
                'End' => '-' 
               } 
           } 
         }, 
        'A2' => { 
         'Slab' => { 
           '49_168' => { 
               'Amt' => '3000', 
               'Start' => '49', 
               'End' => '168' 
              }, 
           '169_720' => { 
               'Amt' => '4000', 
               'Start' => '169', 
               'End' => '720' 
               }, 
           '2_48' => { 
              'Amt' => '5000', 
              'Start' => '2', 
              'End' => '48' 
              }, 
           '721_-' => { 
               'Amt' => '3000', 
               'Start' => '721', 
               'End' => '-' 
              } 
          } 
        } 
       } 

我想將其轉換成簡單的單級散這樣的:

slab =>{ 
       "49_168"=>{"A1"=> "3000","A2"=>"3000"}, 
       "169_720"=>{"A1"=>"4000","A2"=>"4000"}, 
       "2_48"=>{"A1"=>"5000","A2"=>"5000"}, 
       "721_"=>{"A1"=>"3000","A2"=>"3000"} 
     } 

請幫我做這件事,我們如何能做到這一點

+0

您可以通過哈希移動並不斷檢查參考值。當引用任何密鑰爲散列或不散列。當它不是散列時,然後使用它和它的鍵來創建你的單層散列。 – shivams

+0

這不是一個單一的層面,只是重組它,但我已經回答了。 –

回答

1

假設

my %hash = (
    'MainSlab' => { 
       'A1' => { 
          'Slab' => { 
             '49_168' => { 
               'Amt' => '3000', 
               'Start' => '49', 
               'End' => '168' 
              }, 
       'A2' => ... 
); 

然後:

my $hashref  = $hash{'MainSlab'}; 
my $new_hashref = {}; 
foreach my $ax (keys %$hashref) { 
    foreach my $k (keys %{$hashref->{$ax}{'Slab'}}) { 
    $new_hashref->{$k}{$ax} = $hashref->{$ax}{'Slab'}{$k}{'Amt'}; 
    } 
} 
my %new_hash = (slab => $new_hashref); 

會產生:

$new_hash = ('slab' => { 
       '49_168' => { 
         'A1' => '3000', 
         'A2' => '3000' 
         }, 
       '169_720' => { 
         'A1' => '3000', 
         'A2' => '4000' 
       ... 
      ); 
+0

感謝您的幫助:d – Developer

+0

我想添加一個鍵也如開始或結束大於48的話,我想補充說明的關鍵,這將轉化爲像48_168天數將有遞減鍵從「37天」 – Developer

+0

請幫我在這 – Developer

0
use Data::Dumper qw(); 

## actual hash $h1 
my $h1 = { 'MainSlab' => { 'A1' => { 'Slab' => { '49_168' => { 'Amt' => '3000', 'Start' => '49', 'End' => '168' }, '169_720' => { 'Amt' => '3000', 'Start' => '169', 'End' => '720' }, '2_48' => { 'Amt' => '3000', 'Start' => '2', 'End' => '48' }, '721_-' => { 'Amt' => '3000', 'Start' => '721', 'End' => '-' } } }, 'A2' => { 'Slab' => { '49_168' => { 'Amt' => '3000', 'Start' => '49', 'End' => '168' }, '169_720' => { 'Amt' => '4000', 'Start' => '169', 'End' => '720' }, '2_48' => { 'Amt' => '5000', 'Start' => '2', 'End' => '48' }, '721_-' => { 'Amt' => '3000', 'Start' => '721', 'End' => '-' } } } } }; 

## transform to $h2 
my @l2 = keys(%{$h1->{'MainSlab'}}); 
my @l1 = keys(%{$h1->{'MainSlab'}->{$l2[0]}->{'Slab'}}); 
my $h2 = {}; 
foreach my $l1 (@l1) { 
    my $inner = {}; 
    foreach my $l2 (@l2) { 
     $inner->{$l2} = $h1->{'MainSlab'}->{$l2}->{'Slab'}->{$l1}->{'Amt'}; 
    } ## end foreach 
    $h2->{'slab'}->{$l1} = $inner; 
} ## end foreach 

## print result 
print(Data::Dumper->Dump([$h2],['$h2'])); 

輸出:

$h2 = { 
     'slab' => { 
        '49_168' => { 
            'A1' => '3000', 
            'A2' => '3000' 
           }, 
        '169_720' => { 
            'A1' => '3000', 
            'A2' => '4000' 
           }, 
        '2_48' => { 
           'A1' => '3000', 
           'A2' => '5000' 
           }, 
        '721_-' => { 
           'A1' => '3000', 
           'A2' => '3000' 
           } 
        } 
     }; 
+0

解除引導箭頭' - >'在第一個之後沒有必要。 –