Разбор строки и выполнение операции в Perl - PullRequest
3 голосов
/ 11 ноября 2019

Я пытаюсь проанализировать строку 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

Ответы [ 2 ]

4 голосов
/ 11 ноября 2019

Вы можете сделать это с помощью регулярного выражения вместо разделения:

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
2 голосов
/ 11 ноября 2019

Вероятно, вам нужен следующий код (примечание: я печатаю все 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...