向Perl哈希表添加元素时出现异常行为

3

我正在尝试通过将时间标记从事件内部移动到其父级内部,来按时间分组一些XML。也就是说...

<schedule>
    <event>
        <time>02:00</time>
        <other_details>details</other_details>
    </event>
    <event>
        <time>02:00</time>
        <other_details>details</other_details>
    </event>
    <event>
        <time>03:00</time>
        <other_details>details</other_details>
    </event>
<schedule>

应该变成

<schedule>
    <event>
        <time>02:00</time>
        <event_details>
            <other_details>details</other_details>
        </event_details>
        <event_details>
            <other_details>details</other_details>
        </event_details>
    </event>
    <event>
        <time>03:00</time>
        <event_details>
            <other_details>details</other_details>
        </event_details>
    </event>
</schedule>

我的方法是使用XML::Simple将XML读入哈希表,然后取出时间作为另一个哈希表的键,该哈希表保存event_details数组。代码:

#!/Perl/bin/perl
#scheduleConversion.plx v1.0

use strict;
use warnings;

use XML::Simple;
use Data::Dumper;

use constant EVENTTAG   => 'event';
use constant TIMETAG    => 'event_time';
use constant DETAILSTAG => 'event_details';

if($#ARGV != 0) {
    print "Usage: First argument should be filename, optionally with path.";
}

# Get filename/path from the arguments
my $docname = shift @ARGV;

# Create a new XML parser
my $xml = new XML::Simple;
# Read in the XML data
my $XMLdata = $xml->XMLin($docname);
# New XML data to be output
my %XMLnew;
$XMLnew{&EVENTTAG} = [];

my %timeGroups;

foreach (@{$XMLdata->{&EVENTTAG}}) {
    my $time = ${$_}{&TIMETAG};
    delete ${$_}{&TIMETAG};

    # Make an array if none exists
    $timeGroups{$time} = [] unless exists($timeGroups{$time});
    # Add our details to the array
    push($timeGroups{$time}, $_);
}

foreach (%timeGroups) {
    push ($XMLnew{&EVENTTAG}, $_{&EVENTTAG});
}

#print $xml->XMLout(%XMLnew);

问题出在我尝试打印Dumper(%timeGroups);时,它给了我这样的结果:
$VAR1 = '2015-09-10 03:59:00';
$VAR2 = [
          {
            'event_detail_1' => 'details_1',
            'event_detail_2' => 'details_2'
          }
        ];

我希望看到日期作为键,但似乎完全不同。 我使用单独的哈希进行了测试,也创建了一个键/值对,如$hash {key} ='value',结果与上述相同,而$hash = {'key' => 'value'}则得到了预期的结果。
我确定我错过了有关Perl哈希工作原理的某些内容,但我理解这两种方法应该是等效的。 我已经用脑力攻克这个问题一整天,现在我只能将其归因于这个原因。
1个回答

1

print Dumper(%timeGroups)%timeGroups 扁平化为键和值列表,并将多个参数传递给 Dumper。通常情况下,您需要传递单个引用给 Dumper:print Dumper(\%timeGroups)


...就是这样吗?真的这么简单吗?非常感谢,我现在已经在文件输出中引用了哈希,并且它几乎按照预期工作。只需要正确格式化哈希,使其以标签形式输出详细信息,而不是时间标签的属性。 - Magrias

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接