【问题标题】:Referring to a chain of hash keys in a Perl hash of hashes在散列的 Perl 散列中引用散列键链
【发布时间】:2014-03-31 23:28:17
【问题描述】:

我有一个像这样存储数据的哈希值

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

但我想知道如何使用发现的路径以编程方式设置值。

【问题讨论】:

    标签: perl hash-of-hashes


    【解决方案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,
                      },
              },
            },
    }
    

    【讨论】:

    • 谢谢。使用 for 循环(我使用数组作为输入)沿着树向下遍历 hashref 正是我所需要的。如果有人感兴趣,这就是它的样子:我的哈希遍历器在找到给定键时运行一个函数,并将 $k 中的键和@$key_list 中的路径列表传递给它。例如 $k = CID 和 @$key_list = ['BB', 'EUTRA', 'DL', 'PLCI', 'CID'] ` pop @$key_list;我的 $hashref = \%deviceSettings; $hashref = $hashref->{$_} for (@$key_list); $hashref->{$k} = '我的新价值'; ` 非常直截了当。非常感谢。
    【解决方案2】:

    Data::Diver 是一个使用路径访问嵌套结构的模块。

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

    【讨论】:

    • 谢谢。看起来它可以满足我的需要,但另一个答案使用内置功能,如果没有 Data::Diver 包,它会更容易交付。
    • 啊,您最初的问题并不清楚您想要的任何路径的所有键都已经存在; Data::Diver 可能是矫枉过正。
    • 如果@path 的任何元素可以是数字,则应为DiveVal( $device_settings_rf, map \$_, @path )
    猜你喜欢
    • 1970-01-01
    • 2016-09-08
    • 2013-05-09
    • 2011-03-13
    • 2010-12-31
    • 2013-09-10
    • 2013-07-19
    • 1970-01-01
    相关资源
    最近更新 更多