Есть несколько способов сделать это, также в зависимости от того, что именно нужно.
Использование вспомогательного хэша для каждого массива, чтобы свести проверку существования к поиску
use warnings;
use strict;
use feature 'say';
sub diff_arys {
my ($ra1, $ra2) = @_;
my %in_a1 = map { $_ => 1 } @$ra1;
my %in_a2 = map { $_ => 1 } @$ra2;
my @not_in_one = grep { not exists $in_a1{$_} } @$ra2;
my @not_in_two = grep { not exists $in_a2{$_} } @$ra1;
return (@not_in_one ? \@not_in_one : undef),
(@not_in_two ? \@not_in_two : undef);
}
my @ary1 = 'a'..'e'; # a,b,c,d,e
my @ary2 = ('a'..'d', 'z'); # a,b,c,d, z
my ($not_in_one, $not_in_two) = diff_arys(\@ary1, \@ary2);
say "@$not_in_one" if $not_in_one;
say "@$not_in_two" if $not_in_two;
Prints
z
e
Это находит различия в обоих направлениях, элементы в одном массиве, но не в другом.Если вы точно знаете, что вам это нужно только для одного «направления», чтобы идентифицировать вещи, которые находятся в первом массиве, но не во втором (как это видно из вопроса), то настройте подпрограмму для этого, и код станет проще.
Обратите внимание на выбор интерфейса: верните undef
, если различий не обнаружено, иначе arrayref.
Есть хорошие модули для такой работы.Весьма исчерпывающим является List :: Compare .Есть также Array :: Utils и Array :: Compare , и еще больше.Кроме того, для этого можно использовать более сложные инструменты, например Algorithm :: Diff .
.