我试图通过将时间标签从事件内移动到其父级内来更改一些 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
. Code:
#!/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);
问题是当我尝试print 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 哈希如何工作的一些内容,但我认为这两种方法应该是等效的。我一整天都在用我的大脑思考这个问题,我刚刚设法将其范围缩小到这个原因。