用于比较文件内容的perl代码

时间:2016-05-19 16:55:46

标签: perl wildcard string-comparison

我是perl脚本编写的新手。我有2个文件。我想逐行比较内容并删除匹配的内容。如果我在1个文件中使用通配符来匹配第二个文件中的多个行,它应该删除多个匹配并将其余的写入另一个文件。我从另一封邮件中得到了一点,它没有照顾外卡

use strict;
use warnings;
$\="\n";

open my $FILE, "<", "file.txt" or die "Can't open file.txt: $!";
my %Set = map {$_ => undef} <$FILE>;
open my $FORBIDDEN, "<", "forbidden.txt" or die "Can't open forbidden.txt: $!";
my %Forbidden = map {$_ => undef} <$FORBIDDEN>;
open my $OUT, '>', 'output' or die $!;
my %Result = %Set; # make a copy
delete $Result{$_} for keys %Forbidden;
print $OUT keys %Result

1 个答案:

答案 0 :(得分:0)

我不确定你对“外卡”的意思。

然而,有很多方法可以做你想要的。由于使用某些现有模块更漂亮,您可以使用cpan上提供的List::Compare模块。

使用以下代码,您可以使用此模块存储一个文件(file.txt)中包含的所有行,但不存储其他文件(forbidden.txt)中的所有行。所以你隐含地匹配相等的行。此代码不会从文件中删除,但会找到它们。

您的代码如下:

use strict;
use warnings;
use File::Slurp qw(read_file); #cpan-module
use List::Compare; #cpan-module

chomp( my @a_file = read_file 'file.txt' );
chomp( my @b_file = read_file 'forbidden.txt' );

#here it stores all the lines contained in the 'file.txt' 
#but not in the 'forbidden.txt' in an array 
my @a_file_only = List::Compare->new( \@a_file, \@b_file )->get_Lonly;

print "$_\n" for @a_file_only; 
#here you could write these lines in a new file to store them. 
#At this point I just print them out.

新方法:

foreach my $filter (@b_file){
    @a_file = grep{ /${filter}/} @a_file;
}
 print Dumper(@a_file);

通过使用每个过滤器,它将逐步减少@a_file中的行。