2014-03-31 195 views
0

我哈希存儲像這樣參考哈希鍵的鏈哈希一個Perl哈希

our %deviceSettings = (
    BB => { 
      EUTRA => { 
      DL => { CPC => "NORM", PLCI => { CID => 88 }, ULCPc => "NORM" }, 
      UL => { 
        REFSig => { DSSHift => 2, GRPHopping => 1, SEQHopping => 1 }, 
        SOFFset => 0, 
        }, 
      }, 
     }, 
    ... 
); 

我可以走的結構,並找到一個特定的關鍵數據的哈希,說CID,並檢索其值並將'路徑'存儲在數組('BB', 'EUTRA', 'DL', 'PLCI')中。

我也可以明確設置的值,這樣

$deviceSettings_ref->{BB}{EUTRA}{DL}{PLCI}{CID} = 99 

但我想知道如何設置的值編程使用發現的路徑。

回答

1

可以使用佔位符$hashref步行哈希:

my $hashref = \%deviceSettings; 

$hashref = $hashref->{$_} for qw(BB EUTRA DL PLCI); 
$hashref->{CID} = 'My New Path'; 

use Data::Dump; 
dd \%deviceSettings; 

輸出:

{ 
    BB => { 
      EUTRA => { 
      DL => { CPC => "NORM", PLCI => { CID => "My New Path" }, ULCPc => "NORM" }, 
      UL => { 
        REFSig => { DSSHift => 2, GRPHopping => 1, SEQHopping => 1 }, 
        SOFFset => 0, 
        }, 
      }, 
     }, 
} 
+0

謝謝。使用for循環(我使用一個數組作爲輸入)沿着樹走向hashref就是我所需要的。如果任何人感興趣這就是它的樣子: 我的哈希walker運行一個函數,當它找到一個給定的鍵並將它傳遞給$ k中的鍵和@ $ key_list中的路徑列表。例如$ k = CID和@ $ key_list = ['BB','EUTRA','DL','PLCI','CID'] ' \t pop @ $ key_list; \t my $ hashref = \%deviceSettings; (@ $ key_list); $ hashref = $ hashref - > {$ _}; \t $ hashref - > {$ k} ='我的新值'; ' 非常直截了當。非常感謝。 – JonFitt

1

Data::Diver是用於訪問使用路徑嵌套結構的模塊。

use Data::Diver 'DiveVal'; 

my $device_settings_rf = {}; 
my @path = ('BB', 'EUTRA', 'DL', 'PLCI', 'CID'); 
DiveVal($device_settings_rf, @path) = 99; 
+0

謝謝。看起來它會做我所需要的,但另一個答案使用了內置的功能,如果沒有Data :: Diver包,它將更容易交付。 – JonFitt

+0

啊,從你原來的問題來看,並不清楚你想要的任何路徑的所有鍵都已經存在; Data :: Diver可能是過度殺傷的。 – ysth