我想知道是否有任何简单的算法可以比较,看看一个哈希是否是另一个哈希的子集。
例如,如果
$HASH{A} = B;
$HASH{B} = C;
$HASH{C} = D;
$HASH2{A} = B;
$HASH2{B} = C;
然后%HASH2是%HASH的子集。
答案 0 :(得分:4)
这使用"smart matching"(~~
)和List::Util::first
use 5.010;
use List::Util qw<first>;
sub hash_is_subset {
my ( $hash, $cand ) = @_;
return not defined( first { not $hash->{ $_ } ~~ $cand->{ $_ } } keys %$cand );
}
hash_is_subset( \%HASH, \%HASH2 );
答案 1 :(得分:1)
假设您的哈希很简单(例如,它们不包含引用作为值),您可以通过一个简单的循环来执行此操作:
sub is_subset {
my ($h1, $h2) = @_;
while (my ($k, $v) = each %$h1) {
exists $h2->{$k} && $v eq $h2->{$k}
or return; # in case of list context, thanks davorg
}
return 1;
}
在英语中,它遍历第一个散列中的每个键值对,并且询问(a)是第二个散列中的键,(b)如果是,则值是否相同?如果找到的不是,则第一个哈希不是第二个哈希的子集。否则就是。
如果您的哈希值更复杂,例如,值可能是hashref,那么您首先需要更好地定义“子集”(例如,{ a => 1 }
是{ h2 => { a => 1 } }
的子集),并且可能使用一些递归(或检查CPAN)。