use strict; use warnings; use Test::More; use Benchmark qw(cmpthese); use List::Util qw(uniq); my @first = (1 .. 1000); my @second = (300 .. 700); sub slice { my %seen; @seen{@{$_[0]}, @{$_[1]}} = (); return [keys %seen]; } sub listutil { return [uniq(@{$_[0]}, @{$_[1]})]; } sub seengrep { my %seen; return [grep {! $seen{$_}++} @{$_[0]}, @{$_[1]}]; } is_deeply [sort {$a <=> $b} @{slice( \@first, \@second)}], [sort {$a <=> $b} @{listutil(\@first, \@second)}], "They matched."; is_deeply [sort {$a <=> $b} @{listutil(\@first, \@second)}], [sort {$a <=> $b} @{seengrep(\@first, \@second)}], "They matched again."; done_testing(); cmpthese (-5, { slice => sub {my $f = slice (\@first, \@second)}, listutil => sub {my $f = listutil(\@first, \@second)}, seengrep => sub {my $f = seengrep(\@first, \@second)}, });