2

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

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

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

是否可以使用 Perl 做到这一点?

4

1 回答 1

2

XML 没有行号的概念。要访问 XML 中的值,请使用 XML 解析器,例如XML::LibXML.

假设您的数据是

<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');
}

如果只想访问一定数量的Keys,可以在 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 安装。

于 2013-08-06T13:42:59.527 回答