【问题标题】:Parsing string and performing operation in perl在 perl 中解析字符串并执行操作
【发布时间】:2020-03-06 17:31:18
【问题描述】:

我正在尝试解析 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

【问题讨论】:

  • 我的方法对吗?
  • Net::Traceroute 可能有用。
  • split 上的提示:' '(引号之间的单个空格)在任意数量的任何空格上拆分(并丢弃前导和尾随空格;请参阅文档)。然后,如果您的线路肯定始终采用相同的格式,您可以这样做并计算位置:my @delays = (split ' ', $str)[3,5,7];。坏处:依赖空格(或字段数)。所以也许正则表达式在这里更好。

标签: regex string perl split


【解决方案1】:

您可以使用正则表达式而不是拆分来做到这一点:

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

【讨论】:

  • 注意:如果可以有另一个 N ms(除了这三个),那么连续列出所有三个确保我们不会选择另一个。如果没有,可以my @delays = $str =~ /([0-9.]+)\s+ms/g;
【解决方案2】:

您可能正在寻找以下代码(注意:出于调试目的,我在同一行上打印了所有 3 个延迟)。

use strict;
use warnings;

my $debug = 1;

while( <DATA> ) {
    my @delay = /(\S+) ms/g;
    printf "%.3f %.3f %.3f\n",@delay if $debug;
}

__DATA__
 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 ms  1.510 ms  1.621 ms

【讨论】:

    猜你喜欢
    • 2014-07-19
    • 1970-01-01
    • 2019-05-07
    • 2015-03-11
    • 2013-05-07
    • 2012-01-24
    • 1970-01-01
    • 2019-04-19
    • 2021-06-17
    相关资源
    最近更新 更多