2016-05-12 6 views
0

Ich habe alles versucht, um eine Liste von Wörtern, die im Vergleich zu einer anderen Datei eindeutig zu einer Datei existieren. Ich legte etwas Debug-Druck in den Code ein, um herauszufinden, wo es hinging, und stellte fest, dass der Code in der Vergleichsschleife nie etwas tut.Vergleichen Sie zwei Listen von Wörtern und speichern Sie die Wörter, die nicht in der zweiten Liste sind in Perl

Ich denke, ich bin blind oder übersehen etwas wirklich offensichtlich - jemand bitte zeigen Sie, was falsch ist und genießen Sie lachen über meine "wahrscheinlich ein Anfänger" Fehler.

while (<IN>) { #read the file 

    chomp; 

    $_ = lc; #convert to lower case 
    s/ --//g; #remove double hyphen dashes 
    s/ -//g; #remove single hyphen dashes 
    s/ +/ /g; #replace multiple spaces with one space 
    s/[~`@#$%^&*-+=<>.,:;?"!_()\[\]]//g; #remove punctuation 

    @hwords = split; 
# foreach $w (@hwords) { print "$w \n";} 

} 
while (<IN0>) { #read the file 

    chomp; 

    $_ = lc; #convert to lower case 
    s/ --//g; #remove double hyphen dashes 
    s/ -//g; #remove single hyphen dashes 
    s/ +/ /g; #replacxew multiple spaces with one space 
    s/[~`@#$%^&*-+=<>.,:;?"!_()\[\]]//g; #remove punctuation 

    @awords = split; 
# foreach $w (@awords) {print "$w\n";} 

} 

$count =0; 

@unique =(); 

print "got here!\n"; # YES - it gets here 

foreach $w (@hwords) { print "$w \n";} 

foreach $h (@hwords) { 

    $x=1; 
    print "got there!\n"; # NOPE, doesn't get here 
    foreach $a (@awords) { 
    if ($h eq $a) { 
     $x=0; 
     print "equals\n"; # NEVER see this 
    } 
    } 
    if ($x eq 1) { 
    ++$count; 
    @unique = @unique, $h; 
    print "$count, $h\n"; # NEVER see this, either 
    } 
} 
+0

Beachten Sie, dass der Code korrekt angezeigt werden, müssen Sie es im Editor-Fenster mit 4 Leerzeichen einrücken. Ich habe dieses für Sie bearbeitet – stevieb

+0

Ich würde "perltidy" auch empfehlen, um Einzug konsistent zu bekommen. – Sobrique

Antwort

1

Erstens, jede Iteration der Schleife ersetzt @hwords und @awords vollständig. Am Ende enthalten sowohl @hwords als auch @awords nur die Wörter aus der letzten Zeile der jeweiligen Datei.

Sie müssen die Wörter aus der ersten Datei sowieso nur abholen. Dann, während Sie die zweite Datei lesen, vergleichen Sie ihre Wörter mit den gespeicherten Wörtern aus der ersten Datei.

also in der ersten Schleife, anstatt @hwords die Einstellung, macht es zu einem Lookup-Hash:

$hwords{$_} = 1 for split; 

Jetzt, nachdem die erste Datei gelesen worden ist, werden alle seine Worte sind die Schlüssel des %hwords Hash .

Dann, wenn die zweite Datei zu lesen, in der zweiten Schleife, schaut jedes Wort in dem Lookup-Hash-up:

print "Word not found: $_\n" 
    for grep { !$hwords{$_} } split; 
1

Dies ist eine FAQ, kann die Lösung in der FAQ.

perldoc -q intersect

Mein Dank geht an @Botje auf #perl auf irc.freenode.net für mich dies erinnert.

0

Bitte überprüfen Sie dies:

use Array::Utils qw(:all); 

my @a = qw(a b c d); 
my @b = qw(c d e f); 

#get items from array First list that are not in array Second List 
my @notinsecond = array_minus(@b, @a); 

#get items from array Second list that are not in array First List 
my @notinfirst = array_minus(@a, @b); 


print join "\n", @notinfirst; 
print join "\n", @notinsecond; 
Verwandte Themen