首先,我将您的问题解释为特定于 Keys/Values pair上的欺骗。这有点尴尬——正常的问题只是测试键,但我们可以通过将键和值都作为生成新键的函数的输入来进行键值对。
如果您只是使用制表符分隔的 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
在你理解了这一点之后,剩下的练习也很简单。我使用了一个非常简单的算法,它将键和值连接起来,并以此为哈希索引。这消除了狡猾的碰撞尝试,但对于您的任务可能不是必需的。随意问的问题。
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