在Perl散列中引用散列键链

在Perl散列中引用散列键链,perl,hash-of-hashes,Perl,Hash Of Hashes,我有一个散列存储数据,如下所示 our %deviceSettings = ( BB => { EUTRA => { DL => { CPC => "NORM", PLCI => { CID => 88 }, ULCPc => "NORM" }, UL => { REFSig => { DSSHift => 2, GRPHo

我有一个散列存储数据,如下所示

our %deviceSettings = (
  BB => {
          EUTRA => {
            DL => { CPC => "NORM", PLCI => { CID => 88 }, ULCPc => "NORM" },
            UL => {
                    REFSig  => { DSSHift => 2, GRPHopping => 1, SEQHopping => 1 },
                    SOFFset => 0,
                  },
          },
        },
  ...
);
我可以遍历结构并找到一个特定的键,比如说
CID
,然后检索它的值并将“path”存储在数组
('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,
                  },
          },
        },
}

您可以使用占位符
$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,
                  },
          },
        },
}
是使用路径访问嵌套结构的模块

use Data::Diver 'DiveVal';

my $device_settings_rf = {};
my @path = ( 'BB', 'EUTRA', 'DL', 'PLCI', 'CID' );
DiveVal( $device_settings_rf, \(@path) ) = 99;
是使用路径访问嵌套结构的模块

use Data::Diver 'DiveVal';

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

谢谢使用for循环(我使用数组作为输入)沿着树遍历hashref正是我所需要的。如果有人感兴趣,这就是它的样子:我的hash walker在找到一个给定的键并在$k中传递该键时运行一个函数,在@$key_列表中传递路径列表。例如,$k=CID和@$key_列表=['BB','EUTRA','DL','PLCI','CID']`pop@$key_列表;my$hashref=\%设备设置;$hashref=$hashref->{$\}表示(@$key\u列表);$hashref->{$k}='我的新值';`非常直截了当。非常感谢,谢谢。使用for循环(我使用数组作为输入)沿着树遍历hashref正是我所需要的。如果有人感兴趣,这就是它的样子:我的hash walker在找到一个给定的键并在$k中传递该键时运行一个函数,在@$key_列表中传递路径列表。例如,$k=CID和@$key_列表=['BB','EUTRA','DL','PLCI','CID']`pop@$key_列表;my$hashref=\%设备设置;$hashref=$hashref->{$\}表示(@$key\u列表);$hashref->{$k}='我的新值';`非常直截了当。非常感谢,谢谢。看起来它可以满足我的需要,但另一个答案使用内置功能,在没有Data::Diver包的情况下更容易交付。啊,从您最初的问题中不清楚您想要的任何路径的所有密钥都已经存在;数据::潜水员可能是杀伤力过大。如果
@path
的任何元素可能是一个数字库,则应该是
DiveVal($device\u settings\u rf,map\$\u,@path)
。看起来它可以满足我的需要,但另一个答案使用内置功能,在没有Data::Diver包的情况下更容易交付。啊,从您最初的问题中不清楚您想要的任何路径的所有密钥都已经存在;数据::潜水员可能是杀伤力过大。如果
@path
的任何元素可能是数字,则应为
DiveVal($device\u settings\u rf,map\$,@path)