加入两个哈希到一个

时间:2013-09-05 12:18:07

标签: perl hash libxml2 perl5

我通过调用递归方法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的大型父节点,其属性为BSNProjectNameStationName
  • 许多名为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组合到一个哈希中 - 而无需遍历所有键?

1 个答案:

答案 0 :(得分:4)

你想要这样的东西:

push @$items, { %$report, %$attr };

订单很重要 - 在这种情况下,任何共享密钥都将具有$attr的值,而不是结果哈希中$report的值。