我正在尝试通过将时间标记从事件内部移动到其父级内部,来按时间分组一些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哈希工作原理的某些内容,但我理解这两种方法应该是等效的。 我已经用脑力攻克这个问题一整天,现在我只能将其归因于这个原因。