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{$_}++, @_ }