如何删除另一个键中已经存在的值?
例如:
我有一个列表文件File_A
:
a 1 b 4 c 1 a 2 b 5 c 6
和
#!/usr/bin/env perl
use strict;
use warnings;
use Data::Dumper;
my %hash;
while (File_A) {
push {@{$hash{$File_A[0]}, $File_A[1]}};
}
So that my %hash is equal to this
%hash = (
a => [ '1','2'],
b => [ '4','5'],
c => [ '1','6'],
);
在键1
和a
中都存在值c
。有什么办法可以防止重复值被推入
散列数组,使它看起来像这样?
%hash = (
a => [ '1','2'],
b => [ '4','5'],
c => [ '6'],
);
答案 0 :(得分:2)
对于每个新值,您需要检查是否已看到它。为此,应单独记录所有唯一值,以使其高效,轻松地根据它们检查新值。
然后使用哈希将可见的值存储为键,因为它只需要查找即可检查键是否存在。如果没有,则进行处理(将数据添加到结果等),然后将该键添加到已经看到的键中。
use warnings;
use strict;
use Data::Dump qw(dd);
my $file = shift || 'File_A';
my (%result, %seen);
open my $fh_A, '<', $file or die "Can't open $file: $!";
while (<$fh_A>) {
my ($key, $val) = split;
next if exists $seen{$val}; # saw this value already, skip
push @{$result{$key}}, $val;
$seen{$val} = 1;
}
dd \%result;
我使用Data::Dump查看复杂数据。如果安装有问题,请使用核心Data::Dumper