【问题标题】:How to restructure hash of hashes of hashes?如何重构散列的散列?
【发布时间】:2017-10-13 20:03:09
【问题描述】:

我有一个 hash of hash 为

hash_1 =>{
           hash_2=>{
               a1 => {           
                      1 => m,
                      2 => x,
                      3 => n
                     },
               a2 =>  {
                      1 => a,
                      2 => x,
                      3 => b
                      },
                a3 =>  {
                      1 => c,
                      2 => y,
                      3 => d
                      },
                a4 =>  {
                      1 => i,
                      2 => y,
                      3 => j
                      },
             },
         };

现在我想删除键“hash_2”并添加新键代替“hash_2”,这取决于每个散列 a1、a2、a3 中键“2”的值......所以,就像这里键“2”有两个不同的值:x 和 y。所以我希望这些值代替第一个哈希“hash_2”的键并完全创建一个新的哈希映射。 所以最终结果应该是:

  hash_1 =>{
           x=>{
               a1 => {           
                      1 => m,
                      2 => x,
                      3 => n
                     },
               a2 =>  {
                      1 => a,
                      2 => x,
                      3 => b
                      },
              },
            y => {
                a3 =>  {
                      1 => c,
                      2 => y,
                      3 => d
                      },
                a4 =>  {
                      1 => i,
                      2 => y,
                      3 => j
                      },
             },
         };

我检查了How to replace a Perl hash key?,但不知道如何将键的值作为键。 我尝试删除 hash_2 但没有成功(使用 delete 关键字)。 谢谢。

【问题讨论】:

  • 一个,但不是很好的方法是将 key1 保存为 tmp。然后从哈希中删除密钥。在 ende 从 tmp 创建一个新密钥。也许是这样:我的 $tmp = $hash_name->{key1};删除 $hash_name->{key1}; $hash_name->{x} = $tmp.
  • 但我根本不想要 key1。我希望将第三个哈希中的键的值作为新的 key1。
  • 这是一个很好的时机,问问自己你是如何最终得到这个数据结构而不是你想要的数据结构的,然后退后一步,找到一种方法来得到你想要的数据结构而不是你想要的数据结构你最终得到的数据结构。

标签: perl hash


【解决方案1】:

也许是这样?

use strict;
use warnings 'all';

use Data::Dump;

my $hash_1 = {
  hash_2 => {
    a1 => { 1 => "m", 2 => "x", 3 => "n" },
    a2 => { 1 => "a", 2 => "x", 3 => "b" },
    a3 => { 1 => "c", 2 => "y", 3 => "d" },
    a4 => { 1 => "i", 2 => "y", 3 => "j" },
  }
};

{
    my $data = delete $hash_1->{hash_2};

    for my $key ( keys %$data ) {
        my $item = $data->{$key};
        $hash_1->{ $item->{2} }{ $key } = $item;
    }
}

dd $hash_1;

输出

{
  x => {
         a1 => { 1 => "m", 2 => "x", 3 => "n" },
         a2 => { 1 => "a", 2 => "x", 3 => "b" },
       },
  y => {
         a3 => { 1 => "c", 2 => "y", 3 => "d" },
         a4 => { 1 => "i", 2 => "y", 3 => "j" },
       },
}

【讨论】:

    猜你喜欢
    • 2011-10-06
    • 1970-01-01
    • 2016-05-02
    • 2013-07-19
    • 2010-09-26
    • 2016-07-18
    • 2011-07-03
    • 2013-03-15
    • 2016-09-04
    相关资源
    最近更新 更多