2011-12-17 1 views
2

Есть ли модуль, который может сделать это более красиво (не только заменяя часть смарт-соответствия)?Поиск определенного модуля для сравнения массивов

#!/usr/bin/env perl 
use warnings; 
use 5.014; 

my @array_all = (qw(one two three four)); 
my @array_part = (qw(two four six)); 

my @temp; 
for my $i (@array_part) { 
    push @temp, $i if not $i ~~ @array_all; 
} 

# if (@temp) { do something); 

ответ

3

Вы ищете разницу в множества или, возможно, относительное дополнение, пример неоднозначен. Любого из многочисленных set modules будет достаточно.

use Set::Object qw(); 
Set::Object 
    ->new(qw(two four six)) 
    ->difference(Set::Object->new(qw(one two three four))) 
    ->members; # ('six') 
2

Вы можете использовать List::Compare

#!/usr/bin/env perl 
use strict; 
use warnings; 
use List::Compare; 
my @array_all = (qw(one two three four)); 
my @array_part = (qw(two four six)); 
my @temp; 
my $lc = List::Compare->new('--unsorted',\@array_all,\@array_part); 
@temp = $lc->get_complement; 
print "@temp\n";