我已经尽了一切努力来制作一个单词列表,当与另一个文件相比时,这些单词对于一个文件是唯一存在的。我在代码中进行了一些调试打印,以找出它的去向,并发现代码在比较循环中从未做过任何事情。
我觉得我是盲人,或者忽略了一些非常明显的事情——请有人指出问题所在,并喜欢嘲笑我"可能是新手"的错误。
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 "$wn";}
}
$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 "equalsn"; # NEVER see this
}
}
if ($x eq 1) {
++$count;
@unique = @unique, $h;
print "$count, $hn"; # NEVER see this, either
}
}
首先,循环的每次迭代都会完全替换@hwords
和@awords
。因此,最终,@hwords
和@awords
都将只包含每个相应文件的最后一行中的单词。
无论如何,你只需要从第一个文件中提取单词。然后,在读取第二个文件时,将其单词与第一个文件中存储的单词进行比较。
因此,在第一个循环中,与其设置@hwords
,不如将其设置为查找哈希:
$hwords{$_} = 1 for split;
现在,在读取了第一个文件之后,它的所有字都是%hwords
散列的密钥。
然后,在读取第二个文件时,在第二个循环中,查找查找哈希中的每个单词:
print "Word not found: $_n"
for grep { !$hwords{$_} } split;
这是一个常见问题解答,解决方案可以在常见问题解答中找到。
perldoc-q与相交
感谢irc.greenode.net上#perl上的@Botje提醒我这一点。
请检查此项:
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;