2013-06-05 3 views
3

У меня есть следующий код. Можно ли написать isSubset без дополнительных модулей CPAN?Perl - определить, является ли массив подмножеством другого массива

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")); 
+0

Just [ 'использование массивов :: Utils'] (http://search.cpan.org/~zmij/Array-Utils-0.5/ Utils.pm). Нет причин, по которым вы не можете использовать модули из CPAN. –

+0

'my ($ sub, super) = @_; $ _ ~~ $ super или return 0 для @ $ sub; 1', но это только косметика. Если множество больших или если вы неоднократно проверяете один набор, лучше использовать хеши: '$ _ ~~ $ super' становится' exists $ super -> {$ _} '. Однако работает только строки. – amon

+3

http://stackoverflow.com/questions/2933347/comparing-two-arrays-using-perl –

ответ

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

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

А если серьезно, использование массивов :: Utils :: array_minus.

3

Один довольно эффективный способ сделать это будет:

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 
} 
+0

Отличное крошечное решение! Благодаря! –

Смежные вопросы