首页 > 解决方案 > 在 perl 中解析字符串并执行操作

问题描述

我正在尝试解析 traceroute 字符串并获取服务器延迟。我已经设法做到了,但输出包括延迟和“毫秒”。我如何摆脱“毫秒”,是否可以平均三个延迟?

#!/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

标签: regexstringperlsplit

解决方案


您可以使用正则表达式而不是拆分来执行此操作:

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

正则表达式分解(下面的表达式重复 3 次):

(               # beginning of a capturing group
    [0-9.]+         # a sequence of numbers and dot (at least one character)
)               # end of a capturing group
\s+             # at least one space
ms              # string 'ms'

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

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.094

推荐阅读