0

经过几天阅读 StackExchange 帖子和无休止的反复试验后,我决定请求全世界的帮助。

我存储了以下多行字符串$received_data,我只需要打印每行的传输速度值。

这是我的代码片段:

my $received_data1 = 'Transfer Speed=81.9252432155658
2013/03/25 19:51:43,915|INFO|### STATUS: OK
2013/03/25 19:51:43,915|INFO|### DATA: Transfer Speed= 83.924363456758
2013/03/25 19:51:45,927|INFO|Checking FTP upload status...
2013/03/25 19:51:45,927|INFO|### INFO: Collect Throughput.
2013/03/25 19:51:45,927|INFO|Checking FTP upload status...
2013/03/25 19:51:45,927|INFO|### DATA: Transfer Speed=67.83685237005002';

my $regex =  qr/Transfer Speed=([0-9]{1,}[.][0-9]{1,}[^\n])/m;

if($received_data1 =~ $regex){
    #$received_data1 =~ s/$received_dat/$regex/gm;
    print $1;
}else{
    print "nothingFound";
}

print $1,我只能获得第一个传输速度,即81.9252432155658,而不能获得其他传输速度。我传递了修饰符/gm,让 Perl 知道输入字符串是多行的,并在找到第一个匹配项后继续搜索。正则表达式在$regex这个网站上工作得很好:http: //www.solmetra.com/scripts/regex/index.php我得到了一个匹配值的数组。

获取数组就足够了,因为我可以循环遍历数组并将值打印到文件或控制台上。

我将不胜感激任何帮助。

PS:我已经阅读了大多数其他 Stack Exchange 帖子,但它们没有帮助。我希望我没有重复任何问题。如果有符合我要求的问题,我会很感激这个链接。

4

2 回答 2

2

您需要g匹配操作上的修饰符。您可以在标量上下文中重复调用它

while ($received_data1 =~ /$regex/g) {
   print "$1\n";
}

或在列表上下文中调用一次

for ($received_data1 =~ /$regex/g) {
   print "$_\n";
}

笔记:

  • 速度前面有一个空格,但您的模式没有考虑到它。

  • /m对你没用,因为你既不使用^也不使用$

  • 我不知道你为什么[^\n]在你的模式中使用。它切断了速度的最后一位数字,这可能不是您打算做的事情。

于 2013-03-26T12:44:29.677 回答
2

另一种方法

my @matches = $received_data1 =~ m/Transfer Speed=\s*(\d+\.\d+)/g;

if (@matches) {
    foreach my $m (@matches) {
        print "$m\n";
    }
} else {
    print "nothingFound";
}
于 2013-03-26T13:07:05.283 回答