Perlでは、コレクションから一意の値が必要な場合はいつでも、ハッシュを使用して重複を自動的に折りたたむのに役立つ方法、または少なくともすでに見た値を思い出すのに役立つ方法を考えてください。たとえば、2つのハッシュから一意のキーを取得するにはどうすればよいですか?を参照してください。PerlFAQのセクション4にあります。
交換可能な名前のセットがあるため、ケースは少し注意が必要です。そのため、この情報を記録する必要があります。
sub add_names {
my $equivalent = shift;
for (@_) {
my @names = map lc, @$_;
for (@names) {
die "$0: overlap on name '$_'" if exists $equivalent->{$_};
$equivalent->{$_} = \@names;
}
}
$equivalent;
}
ここに$equivalent、ハッシュへの参照があります。電話した後
add_names $equivalent, [ qw/ Rajesh Ram peter / ];
ハッシュにはキー、、があり'rajesh'、'ram'その'peter'値はすべて[ 'rajesh', 'ram', 'peter' ]。です。このように構成することは、最初に出会った名前に関係なく、名前の完全なセットに到達できることを意味します。
また、次のように、1回の呼び出しで複数の名前のセットをスタックできることにも注意してください。
add_names $equivalent, [ qw/ Rajesh Ram peter / ],
[ qw/ Jim Bob Bubba / ];
名前がマッピングされたら、リストを処理して、見つかった各セットの名を保持できます。与えられた名前について、私たちが以前にそれまたはそれに相当するものを見たことがあるかどうかを確認してください。まだ見たことがない場合は、名前を保存し、すべての同等のものに見られるようにマークを付けます。
sub remove_duplicates {
my $equivalent = shift;
my %seen;
my @uniques;
foreach my $name (@_) {
my $normal = lc $name;
unless ($seen{$normal}) {
push @uniques, $name;
++$seen{$_} for @{ $equivalent->{$normal} };
}
}
wantarray ? @uniques : \@uniques;
}
下部のwantarrayビットは、戻り値を呼び出し元のコンテキストに適合させるための一般的なPerlイディオムです。呼び出し元が配列を必要とする場合は、配列を返します。そうでない場合は、スカラー、つまり一意の名前の配列への参照を返します。
すべてをまとめると
my $equivalent = {};
add_names $equivalent, [qw/ Rajesh Ram peter /];
my @array_name = ("Rajesh","Raju","Ram","John","peter");
print $_, "\n" for remove_duplicates $equivalent, @array_name;
出力:
ラジェッシュ
ラジュ
ジョン