参考哈希键的链哈希一个Perl哈希
问题描述:
我哈希存储像这样参考哈希键的链哈希一个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
但我想知道如何设置的值编程使用发现的路径。
答
可以使用占位符$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,
},
},
},
}
答
Data::Diver是用于访问使用路径嵌套结构的模块。
use Data::Diver 'DiveVal';
my $device_settings_rf = {};
my @path = ('BB', 'EUTRA', 'DL', 'PLCI', 'CID');
DiveVal($device_settings_rf, @path) = 99;
谢谢。使用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