我是Perl的新手。我有两个文本文件,我需要检查两个列表上的匹配字符串。
例如匹配字符串是:
line - file 1: fe/bla/blablabla/abcdefg
line - file 2: blablabla/abcdefg
有一场比赛!
此外,匹配字符串的位置(行号)在两个文件上都不相同。
我尝试将列表放在数组中并将数组与嵌套循环进行比较,但程序的运行时间很长(列表包含数千行),我相信还有另一种方式,不那么天真,更有效率。
这是我将数据放入数组的方式:
my $list1 = /path/to/the/file;
open (FILE , '<' , $list1) or die ("Could not open the file");
while ( my $line = <FILE> ) {
chomp ($line);
$list_1[$i] = $line;
$i = $i+1;
}
close FILE;
我也把它放到了另一个列表中。
这是我的嵌套循环。
for ( $k = 0 ; $k < @list_1 ; $k = $k+1 ) {
for ($i = 0 ; $i < @list_2 ; $i = $i+1 ) {
if (index($list_1[$k] , $list_2[$i]) != -1) {
splice (@list_2 , $i , 1);
last;
}
}
}
答案 0 :(得分:2)
只要file2
不是很大,最简单的方法是从其内容构建正则表达式模式,并根据模式检查file1
中的每一行。
您没有说出您想要的输出,因此我打印了file1
中file2
匹配的所有行。
use strict;
use warnings;
use 5.010;
use autodie;
my ($list1, $list2) = qw( /path/to/list1 /path/to/list2 );
open my $fh, '<', $list2;
my $re = join '|', map { chomp; quotemeta; } <$fh>;
$re = qr/$re/;
open $fh, '<', $list2;
while ( <$fh> ) {
print if /$re/;
}