我通过调用递归方法process_node
处理几个XML文件:
for my $file (@ARGV) {
my $doc = XML::LibXML->load_xml(location => $file);
my $report;
my $items = [];
process_node($doc->getDocumentElement, $report, $items);
print Dumper($items);
}
他们都有类似的结构:
CalRunnerReport
的大型父节点,其属性为BSN
,ProjectName
,StationName
TestItem
我正在尝试准备变量$items
引用的哈希数组 - 以用作DataTables.net(HTML表组件)的数据源:
sub process_node($$$) {
my ($node, $report, $items) = @_;
return unless $node->nodeType == XML_ELEMENT_NODE;
if ($node->nodeName eq 'CalRunnerReport') {
my $attr = get_attributes($node);
$report = {
BSN => $attr->{BSN},
ProjectName => $attr->{ProjectName},
StationName => $attr->{StationName},
}
} elsif ($node->nodeName eq 'TestItem') {
my $attr = get_attributes($node);
push @$items, [ # XXX fails to create a hash
%$report,
%$attr,
];
}
for my $child ($node->getChildnodes) {
process_node($child, $report, $items);
}
}
sub get_attributes($) {
my $node = shift;
my $attr = {};
for my $a ($node->attributes) {
my $key = $a->name;
my $val = $a->value;
$attr->{$key} = $val;
}
return $attr;
}
但是在Data:Dumper
输出中,我看到上面的push
语句没有创建哈希,而是列表:
[
'BSN',
'1147386447',
'ProjectName',
'R089',
'StationName',
'B',
'ExecutionTime',
'00:00:00',
'Result',
'PASS',
'EndTime',
'03/09/2013 21:00:03',
'StartTime',
'03/09/2013 21:00:03',
'Name',
'RecordOperationParameter'
],
[
'BSN',
'1147386447',
'ProjectName',
'R089',
'StationName',
'B',
'ExecutionTime',
'00:00:00',
'Result',
'PASS',
'EndTime',
'03/09/2013 21:00:03',
'StartTime',
'03/09/2013 21:00:03',
'Name',
'ClearLimitTestPendingList'
]
有没有一种很好的方法可以将2个哈希%$report
和%$attr
组合到一个哈希中 - 而无需遍历所有键?
答案 0 :(得分:4)
你想要这样的东西:
push @$items, { %$report, %$attr };
订单很重要 - 在这种情况下,任何共享密钥都将具有$attr
的值,而不是结果哈希中$report
的值。