В массиве хэшей, как удалить значение, которое уже присутствует в другом ключе? - PullRequest
2 голосов
/ 07 мая 2019

Как удалить значение, которое уже присутствует в другом ключе?

Например:

У меня есть табличный файл, 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'],
);

1 Ответ

2 голосов
/ 07 мая 2019

Для каждого нового значения вам нужно проверить, было ли оно замечено. Для этого все уникальные значения должны регистрироваться отдельно, чтобы было проще и эффективнее сравнивать новое значение с ними.

Затем используйте хеш для хранения видимых значений в качестве ключей, поскольку требуется только поиск, чтобы проверить, существует ли ключ. Если он не обрабатывается (добавьте данные к своим результатам и т. Д.) И добавьте этот ключ к хешу с уже увиденными.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...