使用Perl的XML标记中的Sum和mean值

时间:2013-08-06 13:24:40

标签: xml perl sum mean median

我在XML文件中有一堆这样的标签:

<Key Time="47" TT=Xr="485" Yr="311" Yc="183" />

我想获得所有标签中Yc和Yr的总和,最小值,最大值,中值和平均值,以及有限数量的标签(比如第10和30行中的标签)。

是否可以使用Perl执行此操作?

1 个答案:

答案 0 :(得分:2)

XML没有行号的概念。要访问XML中的值,请使用像XML::LibXML这样的XML解析器。

假设您的数据是

<Keys>
  <Key Time="47" Xr="485" Yr="311" Yc="183" />
  <Key Time="47" Xr="485" Yr="123" Yc="381" />
  <Key Time="47" Xr="485" Yr="456" Yc="190" />
  <Key Time="47" Xr="485" Yr="322" Yc="182" />
  <Key Time="47" Xr="485" Yr="223" Yc="165" />
</Keys>

我们可以像

那样解析它
use strict; use warnings;
use XML::LibXML;

my $xml = XML::LibXML->load_xml(string => $the_data);

然后我们可以通过XPath表达式访问属性:

my (@yr, @yc);
for my $key ($xml->findnodes('/Keys/Key')) {
  push @yr, $key->findvalue('./@Yr');
  push @yc, $key->findvalue('./@Yc');
}

如果您只想访问一定数量的Key,可以在Perl代码中优化XPath表达式或计数,或者使用切片:

for my $key ( ($xml->findnodes(...))[10..30] ) { ... }

在收集了所有这些值之后,做一些统计数据是微不足道的。

对于summinmax,您可以使用List::Util中的功能。

修改Statistics::Descriptive模块非常棒:

use Statistics::Descriptive;
use feature 'say'; # for the "say" function. Available since perl5 v10.

my $yr = Statistics::Descriptive::Full->new();
$yr->add_data(@yr);

say "mean: ",   $yr->mean;
say "median: ", $yr->median;
say "min: ",    $yr->min;
say "max: ",    $yr->max;
say "sum: ",    $yr->sum;

可以从CPAN轻松安装此模块。