这是一个长镜头,但有没有任何关于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独立地对每个叶子起作用,所以我不确定它是否“知道”它在结构中的位置。
非常感谢所有人的帮助。
感谢。
答案 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