2016-05-19 16 views
0

zum Vergleichen Ich bin ein Neuling in Perl-Skripten. Ich habe 2 Dateien. Ich möchte Inhalte zeilenweise vergleichen und die passenden löschen. Wenn ich eine Wildcard in einer Datei verwende, um mehrere Zeilen in der zweiten Datei abzugleichen, sollten mehrere Übereinstimmungen gelöscht und der Rest in eine andere Datei geschrieben werden. Ich habe ein bisschen von einer anderen Mail, es kümmert sich nicht um Wild CardsPerl-Code Dateiinhalt

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

Versuchen Sie, 'forbidden.txt' Sie mit Ausschluss bieten Muster zu haben? Oder muss der Inhalt dieser Datei der Reihe nach angewendet werden? Es sieht ein bisschen wie eine Aufgabe für 'Grep' aus. –

+0

Was meinst du mit "Wild Cards"? – choroba

Antwort

0

Ich bin mir nicht sicher, was Sie mit "Wild Card" meinen.

Dennoch gibt es viele Möglichkeiten zu tun, was Sie wollen. Da es schöner ist, einige vorhandene Module zu verwenden, können Sie das Modul List::Compare von cpan verwenden.

Mit dem folgenden Code Sie dieses Modul verwenden, um alle in dem eine Datei enthaltenen Zeilen zu speichern (file.txt), aber nicht in der anderen Datei (forbidden.txt). Sie implizit übereinstimmen die Zeilen, die gleich sind. Dieser Code löscht nicht sie aus der Datei, aber sie finden.

Ihr Code würde wie folgt aussehen:

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. 

der neue Ansatz:

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

Es wird durch die Verwendung jeden Filter der Zeilen in dem @a_file Schritt für Schritt reduzieren.

+0

>, was ich tun muß, sind file1.txt E: nicht passenden Signale (; line-Nr. *) file2.txt E: nicht passenden Signale (; line nein 1) E: nicht passenden Signale ( ; line-Nr 63) E: zu lange Namen (; line keine 354>) Ausgang file3.txt E erwartet: zu lange Namen (; line keine 354>) * shld 2 Szenarien entsprechen der Lage sein, in. file2.txt –

+0

Gibt es noch eine andere Möglichkeit, die String-Zeile no zu ignorieren und Pattern-Matching zu machen oder file1.txt zu editieren, um das multiple Matching zu machen. Ich muss die nicht passenden –

+0

gut ausfiltern, ich habe auch einen Fehler in meiner Lösung. Th File :: Slurp ist kein Kernmodul, also müssen Sie es herunterladen und von cpan installieren. Versuchen Sie dies zuerst, wenn es das gleiche Problem scheint, werde ich ein anderes Aussehen haben! – Otterbein

Verwandte Themen