2

私は次のコードを持っています

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);

これはファイルのサンプル出力です

of : 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 3 3 4 4 4 4 5 6 6 7 7 7 7 7 7 7 7 7

たとえば、最初のドキュメントには「of」という用語が10回(10回)存在していたので、それは真実ですが、繰り返される値を削除する方法があります。つまり、10個の代わりに1個だけ欲しいですあなたの助けに感謝します

4

1 に答える 1

5

そもそも重複を追加しないようにするには、次のように変更します

foreach $word (@words)

foreach $word (uniq @words)

データ構造に重複を残したい場合は、代わりに変更してください

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

print output "$key : ", join(" ", uniq @{ $hash{$key} }), "\n";

uniqList::MoreUtilsによって提供されます。

use List::MoreUtils qw( uniq );

またはあなたは使用することができます

sub uniq { my %seen; grep !$seen{$_}++, @_ }
于 2012-11-06T19:07:05.707 に答える