Perl 删除散列中键的重复值

Perl 删除散列中键的重复值,perl,hash,Perl,Hash,我有以下代码 chdir("c:/perl/normalized"); $docid=0; my %hash = (); @files = <*>; foreach $file (@files) { $docid++; open (input, $file); while (<input>) { open (output,'>>c:/perl/tokens/total'); chomp;

我有以下代码

chdir("c:/perl/normalized");
$docid=0;
my %hash = ();
@files = <*>;
foreach $file (@files) 
  {
    $docid++;
    open (input, $file);    
    while (<input>) 
      {
    open (output,'>>c:/perl/tokens/total');
    chomp;
    (@words) = split(" ");  
    foreach $word (@words)
    {
    push @{ $hash{$word} }, $docid;

    }
      }
   }
foreach $key (sort keys %hash) {
    print output"$key : @{ $hash{$key} }\n";
}


close (input);
close (output);
这是事实,因为“的”一词在第一份文件中存在了10(十个一)次 但是,是否有方法去除重复值;i、 e而不是十个我只想要一个
感谢您的帮助

要避免首先添加DUP,请更改

foreach $word (@words)


如果要将DUP保留在数据结构中,请更改

print output"$key : @{ $hash{$key} }\n";


uniq
由List::MoreUtils提供

use List::MoreUtils qw( uniq );
或者你可以使用

sub uniq { my %seen; grep !$seen{$_}++, @_ }

在添加它之前,检查它是否已经在散列中。还是我在这里漏掉了什么?一直都是。请在发布另一个同类问题之前进行搜索。是否有方法为删除的重复项保留计数器?最好使用散列而不是数组,并将计数作为散列的值<代码>+$hash{$word}{$docid}使用
获取文档ID。您将丢失顺序,但可以使用数字排序轻松恢复。否。您正在将文档id存储在数组值中(
$hash{$word}[$i]=$docid;
)。我建议您将其存储在散列键(
$hash{$word}{$docid}=$count;
)中,并向您演示了如何执行此操作。uniq删除重复项这很好,但我想为删除的重复项创建一个计数器,例如,输出应为1(10)2(7)3(2)4(4)…等等。我不仅第一次听到您的声音,我还回答了您。如果您在实施过程中遇到问题,请发布新问题。我不能在评论中详细说明,我也不是一个代码编写服务人员。
print output "$key : ", join(" ", uniq @{ $hash{$key} }), "\n";
use List::MoreUtils qw( uniq );
sub uniq { my %seen; grep !$seen{$_}++, @_ }