如何使用Perl计算XML文件中暂停内的值
我有一个包含以下信息的XML文件:如何使用Perl计算XML文件中暂停内的值,xml,perl,Xml,Perl,我有一个包含以下信息的XML文件: <Key Time="54288" Type="insert" Value="E" /> <Key Time="55288" Type="insert" Value="A" /> <Key Time="58298" Type="insert" Value="H" /> <Key Time="58398" Type="insert" Value="A" /> <Key Time="58498" Type="i
<Key Time="54288" Type="insert" Value="E" />
<Key Time="55288" Type="insert" Value="A" />
<Key Time="58298" Type="insert" Value="H" />
<Key Time="58398" Type="insert" Value="A" />
<Key Time="58498" Type="insert" Value="L" />
<Key Time="59298" Type="insert" Value="L" />
<Key Time="64298" Type="insert" Value="O" />
这个输出
3010 started at 55288
5000 started at 59298
但是,现在我需要改进脚本,以检索两次>=2400长暂停之间的所有值,还包括暂停开始处的值。例如,从Time=“54288”
到Time=“55288”
我有EA
;从Time=“58298”
到Time=“59298”
我有HALL
等等。这就是我认为您可能想要的,即生成值的属性列表,以超过40分钟的暂停间隔
我使用了一个合适的XML解析器模块来完成这项工作。使用正则表达式解析XML是自找麻烦
use strict;
use warnings;
use XML::Twig;
my @nums;
my $start_time;
my @blocks = ( '' );
my $twig = XML::Twig->new(
twig_handlers => { Key => \&key_handler }
);
$twig->parse(*DATA);
print "$_\n" for @blocks;
sub key_handler {
my ($twig, $key) = @_;
my $time = $key->{att}{Time};
if (defined $start_time) {
my $pause = $time - $start_time;
push @blocks, ("$pause from $start_time to $time", '') if $pause >= 2400;
}
$start_time = $time;
$blocks[-1] .= $key->{att}{Value};
}
__DATA__
<root>
<Key Time="54288" Type="insert" Value="E" />
<Key Time="55288" Type="insert" Value="A" />
<Key Time="58298" Type="insert" Value="H" />
<Key Time="58398" Type="insert" Value="A" />
<Key Time="58498" Type="insert" Value="L" />
<Key Time="59298" Type="insert" Value="L" />
<Key Time="64298" Type="insert" Value="O" />
</root>
为Borodin建模的解决方案,但使用:
使用严格;
使用警告;
使用XML::LibXML;
my$string=do{local$/;};
my$dom=XML::LibXML->load_-XML(string=>$string);
我的@blocks='';
我上次的美元;
对于我的$node($dom->findnodes('//Key')){
我的$time=$node->getAttribute('time');
if(定义为$lasttime){
my$pause=$time-$lasttime;
如果$pause>=2400,则按@blocks,“从$lasttime暂停到$time”;
}
$blocks[-1]。=$node->getAttribute('Value');
$lasttime=$time;
}
为@blocks打印“$\un”;
__资料__
我不明白。您现有的脚本将找到从A到H和从L到O的暂停,对吗?因此,如果你的新脚本应该找到从暂停开始到暂停结束的字母,那么你肯定会得到AHAL?顺便说一句,为了理解你的问题,便于检查答案,编辑问题并使用唯一的字母可能更好@马克:我想我们需要的是一个值
属性列表,这些属性之间用间隔>=2400分隔,因此EA
,霍尔
,O
。至少我的答案是这样的!如果是这样,则创建HALL
的范围的最终值中存在键入错误,该值应为59298
,而不是64298
。我已经解决了这个问题,希望我是对的。@ials:任何长度超过几个简短语句的内容都应该作为程序放入文件中。“长的命令行程序不能很好地工作,尤其是在调试方面。这正是我想要的,”博罗丁说。非常感谢。我做了一个更改,从XML文件中获取数据,而不是将其包含在脚本文件[$twig->parsefile('myFile.XML');]中。但是,我想知道如何能够同时处理一批XML文件,并获得一个文件,其结果与原始文件一致?@ials:这是一个不同的问题,应该这样提出。你对编程知之甚少,以至于你无法将该算法嵌入(@ARGV){…}
的中吗?我是新手,@Borodin。。。编程实际上不是我的工作领域,但我有时需要。。。我会在(@ARGV)上试试你的提示。非常感谢你的帮助。
use strict;
use warnings;
use XML::Twig;
my @nums;
my $start_time;
my @blocks = ( '' );
my $twig = XML::Twig->new(
twig_handlers => { Key => \&key_handler }
);
$twig->parse(*DATA);
print "$_\n" for @blocks;
sub key_handler {
my ($twig, $key) = @_;
my $time = $key->{att}{Time};
if (defined $start_time) {
my $pause = $time - $start_time;
push @blocks, ("$pause from $start_time to $time", '') if $pause >= 2400;
}
$start_time = $time;
$blocks[-1] .= $key->{att}{Value};
}
__DATA__
<root>
<Key Time="54288" Type="insert" Value="E" />
<Key Time="55288" Type="insert" Value="A" />
<Key Time="58298" Type="insert" Value="H" />
<Key Time="58398" Type="insert" Value="A" />
<Key Time="58498" Type="insert" Value="L" />
<Key Time="59298" Type="insert" Value="L" />
<Key Time="64298" Type="insert" Value="O" />
</root>
EA
3010 from 55288 to 58298
HALL
5000 from 59298 to 64298
O
use strict;
use warnings;
use XML::LibXML;
my $string = do {local $/; <DATA>};
my $dom = XML::LibXML->load_xml(string => $string);
my @blocks = '';
my $lasttime;
for my $node ($dom->findnodes('//Key')) {
my $time = $node->getAttribute('Time');
if (defined $lasttime) {
my $pause = $time - $lasttime;
push @blocks, "pause from $lasttime to $time", '' if $pause >= 2400;
}
$blocks[-1] .= $node->getAttribute('Value');
$lasttime = $time;
}
print "$_\n" for @blocks;
__DATA__
<root>
<Key Time="54288" Type="insert" Value="E" />
<Key Time="55288" Type="insert" Value="A" />
<Key Time="58298" Type="insert" Value="H" />
<Key Time="58398" Type="insert" Value="A" />
<Key Time="58498" Type="insert" Value="L" />
<Key Time="59298" Type="insert" Value="L" />
<Key Time="64298" Type="insert" Value="O" />
</root>