【问题标题】:Join two hashes to one [duplicate]将两个哈希合并为一个[重复]
【发布时间】:2013-09-09 06:37:15
【问题描述】:

我通过调用递归方法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'
      ]

有没有一种很好的方法可以将%$report%$attr 的 2 个哈希值组合成一个哈希值 - 而无需遍历它们的所有密钥?

【问题讨论】:

  • 你能说清楚你期待什么数据结构吗?
  • 不,这不可能。您将不得不遍历键。最好的解决方案是{ %$report, %$attr },除非您想检查%$attr 中的值是否会覆盖%$report 中的值。

标签: hash libxml2 perl


【解决方案1】:

你想要这样的东西:

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

顺序很重要 - 在这种情况下,任何共享键都将具有来自 $attr 的值,而不是来自结果哈希中的 $report 的值。

【讨论】:

  • 谢谢,就是这样!我在push 代码中感到困惑并使用了错误的括号
  • 是的,[...] 括号创建对数组的引用,而{...} 括号创建对哈希的引用。里面的值只是一个列表(在散列的情况下,该列表由key1、value1、key2、value2...组成),可以是任何一种方式。
猜你喜欢
  • 2011-02-21
  • 2016-09-02
  • 2017-12-18
  • 2011-04-23
  • 2016-10-07
  • 2018-10-31
  • 2016-12-29
  • 2014-10-01
相关资源
最近更新 更多