Regex 在perl中解析字符串和执行操作

Regex 在perl中解析字符串和执行操作,regex,string,perl,split,Regex,String,Perl,Split,我试图解析跟踪路由字符串并获取服务器延迟。我已经设法做到了,但输出包括延迟和“ms”。我如何摆脱“ms”呢?是否有可能实现平均三次延迟 #!/usr/bin/perl use strict; use warnings; my $str = " 1 sgp-1.valve.net (103.28.54.1) 1.030 ms 1.040 ms 1.212 ms"; my ($a, $b, $delaya, $delayb, $delayc) = split / /, $str; pr

我试图解析跟踪路由字符串并获取服务器延迟。我已经设法做到了,但输出包括延迟和“ms”。我如何摆脱“ms”呢?是否有可能实现平均三次延迟

#!/usr/bin/perl
use strict;
use warnings;

my $str = " 1  sgp-1.valve.net (103.28.54.1)  1.030 ms  1.040 ms  1.212 ms";
my ($a, $b, $delaya, $delayb, $delayc) = split /  /, $str;

print "$delaya\n";
print "$delayb\n";
print "$delayc\n";
返回:

1.030 ms
1.040 ms
1.212 ms
预期:

1.030
1.040
1.212

您可以使用regexp而不是拆分来执行此操作:

my $str = " 1  sgp-1.valve.net (103.28.54.1)  1.030 ms  1.040 ms  1.212 ms";
my ($delaya, $delayb, $delayc) =
    ($str =~ /([0-9.]+)\s+ms\s+([0-9.]+)\s+ms\s+([0-9.]+)\s+ms/);
print join "\n", $delaya, $delayb, $delayc, "\n";
收益率:

1.030
1.040
1.212
1.094
Regexp细分(下面的表达式重复3次):


如果你想要平均值,那么:

my $str = " 1  sgp-1.valve.net (103.28.54.1)  1.030 ms  1.040 ms  1.212 ms";
my @delays = ($str =~ /([0-9.]+)\s+ms\s+([0-9.]+)\s+ms\s+([0-9.]+)\s+ms/);
my $total;
$total += $_ for @delays;
my $avg = $total/@delays;
print $avg, "\n";
收益率:

1.030
1.040
1.212
1.094

可能下面的代码就是您要查找的代码(注意:为了调试,我在同一行上打印了所有3个延迟)

使用严格;
使用警告;
我的$debug=1;
而(){
my@delay=/(\S+)毫秒/克;
printf“%.3f%.3f%.3f\n”,@delay if$debug;
}
__资料__
1 sgp-1.valve.net(103.28.54.1)1.030 ms 1.040 ms 1.212 ms
2 abcd.some.net(104.62.71.8)1.302毫秒1.510毫秒1.621毫秒

我的方法正确吗?可能有用。
split
:一个模式
'
(引号之间的单个空格)在任意数量的空格上拆分(并丢弃前导空格和尾随空格;请参阅文档)。然后,如果您的行肯定总是使用相同的格式,您可以这样做并计算位置:
my@delays=(拆分“”,$str)[3,5,7]。缺点:依赖空白(或字段数)。因此,这里的regex可能更好。注意:如果可以有另一个
nms
(除了这三个),那么连续列出这三个可以确保我们不会选择另一个。如果没有,可以做
my@delays=$str=~/([0-9.]+)\s+ms/g