2016-05-12 9 views
0

私は、別のファイルと比較して1つのファイルに一意に存在する単語のリストを作るためにすべてを試しました。コードにデバッグ印刷を入れて、どこに行こうとしているかを調べ、コードが比較ループで何もしないことを発見しました。単語の2つのリストを比較して、perlの2番目のリストにない単語を保存します

私は盲目的であるか、または何かが本当に明白であることを見落としています。誰かが何が間違っているのかを指摘し、私の「おそらく初心者」のエラーを笑って楽しんでください。

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

注意。私はあなたのためにこれを編集しました – stevieb

+0

インデントの一貫性を得るために、 'perltidy'もお勧めします。 – Sobrique

答えて

1

まず、ループの各反復は、完全に@hwords@awordsを置き換えます。したがって、最後に@hwords@awordsには、それぞれのファイルの最後の行の単語だけが含まれます。

とにかく最初のファイルから単語を拾うだけで済みます。次に、2番目のファイルを読み込んでいる間に、その単語と最初のファイルの格納された単語を比較します。

だから、最初のループでは、代わりに@hwordsを設定するのではなく参照ハッシュ作る:今

$hwords{$_} = 1 for split; 

、最初のファイルが読み込まれた後、その言葉のすべてが%hwordsハッシュのキーです。

続いて、第二のループでは、第2のファイルを読み込むときに、参照ハッシュの各単語を検索:

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

これはよくある質問では、溶液は、FAQで見つけることができます。

perldoc -q intersect

これを私に思い出させるためにirc.freenode.netに#perlに@Botjeに私のおかげ。

0

これを確認してください:適切にあなたのコードを表示するために、あなたは4つのスペースでエディタウィンドウでそれをインデントする必要が

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; 
関連する問題