我在一个 XML 文件中有一堆这样的标签:
<Key Time="47" TT=Xr="485" Yr="311" Yc="183" />
我想在所有标签以及有限数量的标签(比如第 10 行和第 30 行中的那些)中获得 Yc 和 Yr 的总和、最小值-最大值、中值和平均值。
是否可以使用 Perl 做到这一点?
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');
}
如果只想访问一定数量的Key
s,可以在 Perl 代码中细化 XPath 表达式或计数,或者使用切片:
for my $key ( ($xml->findnodes(...))[10..30] ) { ... }
在收集了所有这些值之后,做一些统计是微不足道的。
对于sum
、min
和max
,您可以使用 中的函数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 安装。