2014-10-20 60 views
0

我正在讀取日誌文件的內容,在行上執行正則表達式並將結果放入數組中,但出於某種原因沒有輸出。Perl正則表達式在腳本中找不到模式

use strict; 
use warnings; 

my $LOGFILE = "log.file"; 
my $OUTFILE = "out.file"; 

open(LOG, "$LOGFILE") or die ("Could not open $LOGFILE: $!\n"); 
open(TMP, ">", "$OUTFILE") or die ("Could not open $OUTFILE: $!\n"); 

my @data = (<LOG> =~ /<messageBody>(.*?)<\/messageBody>/sg); 

print TMP "This is a test line. \n"; 

foreach (@data){ 
    print "@data\n"; 
    print "\n=======================\n"; 
} 

close TMP; 
close LOG; 

我的輸出是一個文件(out.file),唯一的內容是「這是一個測試線」。我知道這個正則表達式的工作原理,因爲我在提示符下試過它: -l''BEGIN {undef $ /} while(/(.*?)</messageBody>/sg){print $ 1} log.file> test.file

我在做什麼錯?

回答

0

你的數據可能跨越線。

你會因此需要使用您正則表達式前啜整個事情:

my $logdata = do {local $/; <LOG>}; 

my @data = $logdata =~ m{<messageBody>(.*?)</messageBody>}sg; 
+0

這是完美的。儘管如此,我從來沒有見過這樣的事情。謝謝! – cdbiggs 2014-10-20 20:47:26

0

如果要打印數據的項目,那麼你應該做這樣的事情:

foreach $item (@data){ 
    print TMP "$item\n"; 
    print TMP "\n=======================\n"; 
} 

$item會遍歷所有數組項,將在TMP文件寫入