Это какой-то довольно умный код, который у вас есть. Ваш код более или менее идентичен тому, что написано в Perl FAQ. Однако у меня может возникнуть соблазн сделать это:
my %tmp = map { $_ => 1 } @array2;
my @diff = grep { not exists $tmp{$_} } @array1;
Это получает все в @array1
, что не входит в @array2
, но избегает всех этих зацикленных конструкций (стиль функционального программирования) Хотя то, что я бы действительно сделал бы так:
sub comp (\@\@) {
my %t = map { $_ => 1 } @{$_[1]};
return grep { not exists $t{$_} } @{$_[0]};
}
Тогда вы можете просто сделать:
my @diff = comp(@array1, @array2); # get items in @array1 not in @array2
@diff = comp(@arraty2, @array1); # vice versa
Или вы можете перейти на CPAN . List::Compare::Functional::complement()
делает то, что вы хотите, хотя синтаксис обратный.