【问题标题】:Perl dynamic hash traversalPerl 动态哈希遍历
【发布时间】:2013-12-30 03:30:27
【问题描述】:

哈希引用的数组引用的(0 级或更多级别的哈希引用)的哈希。请注意,叶节点上方的级别将始终是数组引用,即使它们只有一个元素。

我需要通过保留哈希引用的顺序(按插入顺序)来获取 VALUE 的总和(在数组引用的数组中)。

例子:

1)

(
   A => {
           A1 => [
                { VALUE => 10 },
                { VALUE => 20 }
            ],
           B1 => [ 
                { VALUE => 30 } 
           ],
        },
   B => {
            A1 => [ 
                { VALUE => 10 } 
            ],
            B1 => [ 
                { VALUE => 5  } 
            ],
        },
   C => {
            A1 => [ 
                { VALUE => 100 } 
            ],
        },
)

The required output of the above structure will be - 

(
    [A, A1, 30],
    [A, B1, 30], 
    [B, A1, 10],
    [B, B1, 5],
    .
    .
    .
    .
)

2)

(
    A => [
            { VALUE => 10 },
            { VALUE => 20 }
        ],
    B => [ 
            { VALUE => 30 } 
        ],
)       

The required output of the above structure will be - 

(
    [A, 30],
    [B, 30]
)

【问题讨论】:

  • “通过保留哈希引用的顺序”是什么意思?它们的插入顺序是什么?按字母顺序排列?还有什么?
  • 您需要使用函数 ref() 来确定您拥有的引用类型。散列中的键有自己的顺序,与插入顺序无关。您可以使用 sort(keys(%{$hash_ref}))。
  • @ThisSuitIsBlackNot 是按照它们插入的顺序
  • 在上层你有一个 (key1, href1, key2, href2, ... ) 的数组,你可以使用索引访问这个数组。但是,在第二级中,您只有哈希并且没有保留的顺序。用 arrayref [] 替换它,你就会有秩序。

标签: perl key traversal hashref arrayref


【解决方案1】:

您需要编写一个函数来遍历您的哈希结构并计算必要的总和。对于散列中的每个键,它需要做出这样的决定:

  • 如果这个key的值是一个list ref,那么将这个list中hash中的VALUE元素相加,返回[key, sum]

  • 如果这个散列的值是一个散列引用,则递归到那个散列。如果我们从中得到一个列表,请将其附加到我们当前的输出中并继续。

  • 在顶层(深度 0),打印出每个返回的列表。

仍有许多细节需要解决,但这应该能让你走上正确的道路。

【讨论】:

    猜你喜欢
    • 2013-01-16
    • 2016-08-20
    • 2011-10-28
    • 1970-01-01
    • 2022-07-21
    • 2012-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多