使用Data :: Visitor :: Callback(Perl)

时间:2015-06-13 14:56:03

标签: perl

这是一个长镜头,但有没有任何关于Data :: Visitor :: Callback的perl开发人员?

我有一个复杂的数据结构,我正在遍历。每当我找到具有“总”键的哈希时,我需要建立一个URL。我有一些创建这些URL所需的数据,但有些数据来自结构中较高的数据。

我认为我无法访问上述级别,因此无法构建我的网址。我只是意识到我需要从结构上方获得数据。

如果我不能让Data :: Visitor :: Callback为我工作,那就意味着滚动我自己的遍历代码 - 这很痛苦。

我正在遍历的数据是从以下JSON转换而来的(“count”键在转换过程中被重命名为“total”):

[
        {
            "field": "field_name",
            "value": "A",
            "count": 647,
            "pivot": [
                {
                    "field": "field_name",
                    "value": "B",
                    "count": 618,
                    "pivot": [
                        {
                            "field": "field_name",
                            "value": "C1",
                            "count": 572
                        },
                        {
                            "field": "field_name",
                            "value": "C2",
                            "count": 266
                        },
                        {
                            "field": "field_name",
                            "value": "C3",
                            "count": 237
                        }
                    ]
                },
                ...

一旦达到最深层次(C),我需要A和B两个值来构建我的URL。

因为Data :: Visitor :: Callback独立地对每个叶子起作用,所以我不确定它是否“知道”它在结构中的位置。

非常感谢所有人的帮助。

感谢。

1 个答案:

答案 0 :(得分:2)

鉴于您发布的JSON位于变量$json_string中,以下代码使用递归将父项添加到哈希键parent中的所有子项,这样您就可以访问父项中的父项代码。

use strict;
use warnings;
use JSON;

my $data = decode_json($json_string);

add_parent_to_children($_) for @$data;

sub add_parent_to_children {
  my $node        = shift;
  my $parent      = shift;
  $node->{parent} = $parent if $parent;
  if ($node->{pivot}) {
    add_parent_to_children($_, $node) for @{$node->{pivot}};
  }
}

演示:

my $c3 = $data->[0]{pivot}[0]{pivot}[2];
print "$c3->{value}\n";                 # prints C3
print "$c3->{parent}{value}\n";         # prints B
print "$c3->{parent}{parent}{value}\n"; # prints A