まず、あなたの質問は Keys/Valuesペアの重複に固有のものであると解釈します。これは少し厄介です。通常の質問はキーをテストすることですが、キーと値の両方を新しいキーを生成する関数への入力にすることで、キー値を実行できます。
タブ区切りの CSV を使用しているだけの場合は、Text::CSVを使用してください。これは正しく行われ、最も複雑なケースがカバーされているので安心してください! Text::CSV_XSをインストールして、非常に高速にします。
use strict;
use warnings;
use Data::Dumper;
use Text::CSV;
use IO::Handle;
my $csv = Text::CSV->new({sep_char=>"\t"});
my $fh = IO::Handle->new_from_fd( *DATA, 'r' );
while ( not $fh->eof ) {
my $row = $csv->getline( $fh );
warn Dumper $row;
}
__DATA__
aa1 aaa2
aaa1 bbb2
aaa1 ccc2
ccc1 ddd2
eee2 aaa2
それを理解すれば、残りの演習も簡単です。私は、キーと値をsha1'edし、2つを連結し、それによってハッシュにインデックスを付ける非常に単純なアルゴリズムを使用します。これにより、狡猾な衝突の試みが排除されますが、タスクには必要ない場合があります。お気軽にご質問ください。
use feature ':5.10';
use strict;
use warnings;
use Data::Dumper;
use Text::CSV;
use IO::Handle;
use Digest::SHA qw(sha1_hex);
my $csv = Text::CSV->new({sep_char=>"\t"});
my $fh = IO::Handle->new_from_fd( *DATA, 'r' );
my ( %kv, %sha1_kv );
while ( not $fh->eof ) {
my $row = $csv->getline( $fh );
my ($k, $v) = @$row;
my $sha1 = sha1_hex($k) . sha1_hex($v);
if ( exists $sha1_kv{ $sha1 } ) {
say "We have a hit (key/value dupe) for $sha1 [key: $k]";
}
else {
$kv{ $k } = $v;
$sha1_kv{ $sha1 } = $v;
}
warn Dumper $row;
}
__DATA__
aa1 aaa2
aa1 aaa2
aaa1 bbb2
aaa1 ccc2
ccc1 ddd2
eee2 aaa2