Здесь нет волшебной пули.Вы должны пересмотреть свой хэш и проверить каждое значение.Существует множество подходов к этому, и то, что вы используете, скорее зависит от того, как заполняется ваш хэш-источник.
Рекурсивным решением будет:
#!/usr/bin/env perl
use strict;
use warnings;
my $name = 'AUS';
use Data::Dumper;
my %hash = ( 'a'=>{
'x'=> {
'1' =>'US',
'2' =>'UK'
},
'y'=>{
'1' =>'AFRICA',
'2' =>'AUS'
}
},
'b'=>{
'x' =>{
'1' =>'US',
'2' =>'UK'
}
}
);
my %count_of;
sub traverse {
my ( $input_hash ) = @_;
foreach my $sub ( values %{$input_hash} ) {
if (ref $sub) {
traverse ($sub);
}
else {
$count_of{$sub}++;
}
}
}
traverse (\%hash);
print Dumper \%count_of;
print "$name is unique\n" if $count_of{$name} == 1;
Поскольку это рекурсивное решение, оно будет проходить до любой «глубины» хэша, но это может быть не совсем уместно для вашего варианта использования.,
Однако тот факт, что вы говорите о столбцах, подсказывает мне, что этот хеш заполняется откуда-то еще - я бы посоветовал вам взглянуть на этот процесс заполнения, поскольку вполне вероятно, что это лучшее место для начала выбораиз конкретных подсчетов ценностей.
Если вам нужна более универсальная таблица поиска:
my @unique_elements = grep { $count_of{$_} == 1 } sort keys %count_of;
print Dumper \@unique_elements;
my %is_unique = map { $_ => 1 } @unique_elements;
print Dumper \%is_unique;
print "$name is unique\n" if $is_unique{$name};