7

次のコードがあります。isSubsetアドオン CPAN モジュールなしでより簡単に記述できますか?

my @possibleNames = ("adam", "chelsea");
my @actualNames = ("adam", "chucky", "chelsea");

sub isSubset {
    my ($littleSet, $bigSet) = @_;
    foreach (@{$littleSet}) {
        return 0 unless ($_ ~~ @{$bigSet});
    }
    return 1;
}

printf("%s\n", (isSubset(\@possibleNames, \@actualNames) ? "yes" : "no"));
4

2 に答える 2

4

それを行うためのかなり効率的な方法の1つは次のとおりです。

sub isSubset {
    my ($littleSet, $bigSet) = @_;
    my %hash;
    undef @hash{@$littleSet};  # add a hash key for each element of @$littleSet
    delete @hash{@$bigSet};    # remove all keys for elements of @$bigSet
    return !%hash;             # return false if any keys are left in the hash
}
于 2013-06-06T00:08:55.520 に答える
3
my @possibleNames = ("adam", "chelsea");
my @actualNames = ("adam", "chucky", "chelsea");

my $is_subset = 0==grep !defined, map { @$_{@actualNames}=(1)x@actualNames; delete @$_{@possibleNames} } {};

しかし、真剣に、Array::Utils::array_minus を使用してください。

于 2013-06-05T19:04:42.900 に答える