繁体   English   中英

如何从Perl中的多行变量的RegEx操作中获取值数组?

[英]How to obtain an array of values from a RegEx operation on a multiline variable in Perl?

在阅读了几天的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帖子,但它们没有帮助。 我希望我没有重复任何问题。 如果有与我的要求相符的问题,请点击链接。

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

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

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

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

笔记:

  • 速度前面有一个空格,但是您的模式无法解决这个问题。

  • /m对您毫无用处,因为您既不使用^也不使用$

  • 我不知道您为什么在模式中使用[^\\n] 它切断了速度的最后几位,这可能不是您要执行的操作。

另一种方法

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

if (@matches) {
    foreach my $m (@matches) {
        print "$m\n";
    }
} else {
    print "nothingFound";
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM