在散列数组中,如何删除另一个键中已经存在的值?

时间:2019-05-07 05:38:49

标签: arrays perl hash

如何删除另一个键中已经存在的值?

例如:

我有一个列表文件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'],
);

在键1a中都存在值c。有什么办法可以防止重复值被推入 散列数组,使它看起来像这样?

%hash = (
   a => [ '1','2'],
   b => [ '4','5'],
   c => [ '6'],
);

1 个答案:

答案 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