Моя задача состоит в том, чтобы пройтись по списку (до 50 КБ) имен хостов и связанных IP-адресов и MAC-адресов, в поисках дубликатов, чтобы попытаться привести их в порядок, и я нашел это рабочее решение :
#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;
my %HoA = (
host1 => [ "10.1", "ae:ab" ],
host2 => [ "10.2", "aa:ee" ],
host3 => [ "10.3", "aa:ee" ],
host4 => [ "10.1", "ab:ab" ],
);
my %duplicate =();
foreach my $key ( keys %HoA ) {
push @{ $duplicate { $HoA{$key}[0] } } , "$key", "$HoA{$key}[1]" ;
push @{ $duplicate { $HoA{$key}[1] } } , "$key", "$HoA{$key}[0]" ;
}
foreach my $key2 ( keys %duplicate ) {
if ( (scalar @{ $duplicate{$key2} } ) > 2 ) {
print "Duplicate:$key2\tGroup:@{ $duplicate{$key2} }\n";
}
}
print Dumper (\%duplicate) . "\n";
Я не смог найти примеров для поиска дубликатов в хэше массивов, поэтому придумал приведенный выше пример, который хорошо работает с четырьмя записями, которые я перечислил.
Поэтому мне было интересно, есть ли лучшие способы сделать это, и насколько хорошо мой код будет масштабироваться до больших чисел?
Любые идеи с радостью приветствуются.
Приветствия
Andy
UPDATE:
В конце концов я выбрал это решение (после нескольких недель игры) и добавил дополнительное сравнение анонимных массивов.
Спасибо за все комментарии, это действительно помогает обмениваться идеями:
#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;
my (%dup) = ();
my ( $data_a, $data_b ) = ();
my ( @a, @b ) = ();
@a = (
[qw/ host1 10.1 ae:ab /], [qw/ host2 10.2 aa:ee /],
[qw/ host3 10.3 aa:ee /], [qw/ host4 10.1 ab:ab /],
);
@b = (
[qw/ host1 10.1 ae:ab /], [qw/ host3 10.2 aa:ee /],
[qw/ host6 10.3 aa:ee /], [qw/ host4 10.1 ab:ab /],
);
foreach $data_a (@a) {
my ( $host, $ip, $mac ) = @$data_a;
push @{ $dup{$host} }, "$host $ip $mac";
push @{ $dup{$ip} }, "$host $ip $mac";
push @{ $dup{$mac} }, "$host $ip $mac";
}
foreach $data_b (@b) {
my ( $host, $ip, $mac ) = @$data_b;
push @{ $dup{$host} }, "$host $ip $mac";
push @{ $dup{$ip} }, "$host $ip $mac";
push @{ $dup{$mac} }, "$host $ip $mac";
}
print Dumper (%dup) . "\n";
#skipped scalar search