Предполагая, что ваши хеши просты (например, они не содержат ссылок в качестве значений), вы можете сделать это с помощью простого цикла:
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 => 1 }
это подмножество { h2 => { a => 1 } }
) и, вероятно, используйте некоторую рекурсию (или проверьте CPAN).