I'd use grep to find the exact matches and the numbers in one of the arrays (I used @A below) as keys in a hash (%in_A), built using a map. Finally another grep to find the matches in different columns:
use List::Util 'shuffle'; my @A = (shuffle 0 .. 5)[0 .. 3]; my @B = (shuffle 0 .. 5)[0 .. 3]; my $exact = grep { $A[$_] == $B[$_] } 0 .. 3; my %in_A = map { $_ => 1 } @A; my $inexact = (grep { $in_A{$_} } @B) - $exact; print "A = [@A]\nB = [@B]\n"; print "exact: $exact\n"; print "inexact: $inexact\n";
The inexact matches also includes the exact matches, hence the subtraction in the second grep.
Sample output:
A = [4 5 1 0] B = [3 1 5 0] exact: 1 inexact: 2
update: added sample output, improved output format & used grep to calculate inexact matches
In reply to Re: Array compare
by FunkyMonk
in thread Array compare
by plink
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |