2013-03-26 36 views
0

經過幾天閱讀StackExchange的帖子和無盡的反覆試驗,我決定要求這個世界幫助我。如何從Perl中的多行變量的RegEx操作獲取值的數組?

我有以下多行存儲在$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帖子,但他們沒有幫助。我希望我沒有重複任何問題。如果有與我的請求相匹配的問題,我將非常感謝鏈接。

回答

2

您需要匹配op的g修飾符。您可以重複調用它在標量上下文

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

或在列表環境

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

注意,一旦調用它:

  • 有一個速度的前面的空間,但你的模式沒有考慮到它。

  • /m對您無用,因爲您既不使用^也不使用$

  • 我不知道你爲什麼在你的模式中使用[^\n]。它切斷了速度的最後幾位,這可能不是你想要做的事情。

+0

'ikegami',非常感謝你的建議。你的建議像魅力一樣工作! – shailenTJ 2013-03-26 13:02:23

2

另一種方法

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

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

這也是一個很好的答案。我喜歡陣列方法。對此的改進是:'@matches = $ received_data1 =〜m/$ regex/g;''$ regex'是你寫的整齊的正則表達式。 – shailenTJ 2013-03-26 13:14:16