比较两个单词列表,并将不在第二个列表中的单词保存在perl中



我已经尽了一切努力来制作一个单词列表,当与另一个文件相比时,这些单词对于一个文件是唯一存在的。我在代码中进行了一些调试打印,以找出它的去向,并发现代码在比较循环中从未做过任何事情。

我觉得我是盲人,或者忽略了一些非常明显的事情——请有人指出问题所在,并喜欢嘲笑我"可能是新手"的错误。

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;

相关内容

  • 没有找到相关文章

最新更新