2016-05-19 4 views
0

私はperlスクリプトの初心者です。私は2つのファイルを持っています。私は内容を行ごとに比較し、一致するものを削除したい。 2つ目のファイルの複数の行に一致するように1つのファイルにワイルドカードを使用すると、複数の一致が削除され、残りのファイルが別のファイルに書き込まれます。私はワイルドカードの世話をしない別の郵便からちょっと手に入れましたファイルの内容を比較するためのperlコード

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

http://www.perlmonks.org/?node_id=1163469 – choroba

+0

'forbidden.txt'に除外パターンを提供しようとしていますか?または、このファイルの内容を順番に適用する必要がありますか? 'grep'の仕事のように見えます。 –

+0

「ワイルドカード」とはどういう意味ですか?一致しない信号(;ラインなし1) E:一致しない信号(; FILE2.TXT E一致しない信号(ラインなし* ):私は何をする必要があるか – choroba

答えて

0

「ワイルドカード」とはどういう意味ですか?

しかし、あなたが望むことを行う方法はたくさんあります。既存のモジュールを使用する方がきれいなので、cpanにあるList::Compareモジュールを使用することができます。

次のコードでは、このモジュールを使用して1つのファイル(file.txt)に含まれるすべての行を保存しますが、他のファイル(forbidden.txt)には保存しません。だからあなたは暗黙にと一致するの行を一致させます。このコードはファイルからを削除しませんが、それらを見つけることはできません。これは、各フィルタを用いて、ステップで@a_file工程でのラインを削減する

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

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. 

新しいアプローチを:

あなたのコードは次のようになります。

+0

は> FILE1.TXT Eであります;ラインなし63) E:あまりにも長い名前(; E file3.txt予想ラインなし354>) 出力:。あまりにも長い名前(;ラインなし354>) * SHLDは中2つのシナリオと一致することができますfile2.txt –

+0

文字列の行番号を無視し、パターンマッチングやfile1.txtを編集して複数のマッチングを行う方法はありますか?私は一致しないものをフィルタリングする必要があります –

+0

よく、私も私のソリューションでエラーがあります。 Th File :: Slurpはコアモジュールではないので、cpanからダウンロードしてインストールする必要があります。 この問題を解決するには、最初に試してみてください。別の見方があります。 – Otterbein

関連する問題