2014-10-30 73 views
0

我有2个列表,一个是文件列表,另一个是日志文件。如果查询比较perl中的两个列表

我希望if查询可以打印列表中文件名称的每一行日志文件。 如:文件的列表:

myfile1.txt 
myfile2.txt 

日志文件:

line 1 html 
line 2 filename="myfile2.txt" 
line 3 /html 
line 4 /xml 

所需的输出将是:

myfile2.txt found at line 2

我试过几个查询,如

if(index($Lines_Logfile[$logcounter] ,'Lines_Name[$namecounter]') != -1); 

if($Lines_Logfile[$logcounter] =~ m/$Lines_Name[$namecounter]/); 

其中$Lines_Logfile$Lines_Name是列表和$namecounter$logcounterfor回路的线路。

回答

3

您可以使用正则表达式。诀窍在于,您需要使用quotemeta\Q...\E来转义正则表达式特殊字符,并使用字边界\b来防止匹配子字符串。

use strict; 
use warnings; 
use autodie; 

my @files = qw(myfile1.txt myfile2.txt); 

#open my $fh, '<', 'yourfile.log'; 
my $fh = \*DATA; # Testing data used for debug purposes 

while (<$fh>) { 
    for my $file (@files) { 
     if (/\b\Q$file\E\b/) { 
      print "$file found at line $.: $_"; 
     } 
    } 
} 

__DATA__ 
html 
filename="myfile2.txt" 
/html 
/xml 

输出:

myfile2.txt found at line 2: filename="myfile2.txt" 
+0

谢谢你,它的工作。唯一的问题是它导致运行时间极长。除了使用正则表达式之外,还有其他选项吗? – yoko 2014-10-30 11:36:33