如何在不使用perl键的情况下查找散列中是否存在值?

0 perl hash hashtable hashmap

我有这样的哈希映射

my $name = 'AUS'; #dynamic values
my %hash = { 'a'=>{
                  'x'=> {
                         '1' =>'US'
                         '2' =>'UK'
                        }
                  'y'=>{
                          '1' =>'AFRICA'
                          '2' =>'AUS'
                       }
                   }
            'b'=>{
                   'x' =>{
                           '1' =>'US'
                           '2' =>'UK'
                         }
                 }
           };
Run Code Online (Sandbox Code Playgroud)

我试图找出每个列的哈希名称是否唯一

foreach my $key(keys %hash)
{
   if($name ne $hash{}{}{}) #is name unique in whole hash?
   {
      print "something";
   }
   else
   {
      print "nothing";
   }
}
Run Code Online (Sandbox Code Playgroud)

一切都很好,但是当涉及到键'b'时,它会检查AUS是否存在并打印"某些东西"但我希望它也检查'a'键以查看是否具有'AUS'值.那么,如何检查$ name是否存在于整个哈希中(我不能使用通过键值对查找,因为我试图在每列中查找和打印)?

Sob*_*que 5

这里没有灵丹妙药.您必须遍历哈希并检查每个值.有很多方法可以做到这一点,你使用的方法取决于你的哈希源的填充方式.

递归解决方案是:

#!/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; 
Run Code Online (Sandbox Code Playgroud)

因为这是递归的,所以它会走到散列的任何"深度",但这可能不完全适合你的用例.

然而,你在谈论专栏这一事实告诉我,这个哈希是从其他地方填充的 - 我建议你看一下这个人口过程,因为很可能这是一个更好的地方开始挑选特定的计数 - 值.

如果您需要更通用的查找表:

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};
Run Code Online (Sandbox Code Playgroud)