2014-03-31 191 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