perl,比较哈希,子集

时间:2011-12-07 20:32:51

标签: perl hash subset

我想知道是否有任何简单的算法可以比较,看看一个哈希是否是另一个哈希的子集。

例如,如果

$HASH{A} = B;
$HASH{B} = C;
$HASH{C} = D;

$HASH2{A} = B;
$HASH2{B} = C;

然后%HASH2是%HASH的子集。

2 个答案:

答案 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)。