[英]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.