my @A = (1,2,3,4,5,4,3,2,1,2); my @B = (2,4,6,8,10,8,6,4,2); my (%First, %Second); push @{ $First{ $A[$_] } }, $_ for (0..$#A); push @{ $Second{ $B[$_] } }, $_ for (0..$#B); my %Pairs; for my $Common (grep {exists $Second{$_}} keys %First){ for my $Idx (@{ $First{$Common} }){ push @{ $Pairs{$Common} }, map([$Idx, $_], @{ $Second{$Common} }); } } # Print out what we found for (sort keys %Pairs){ print "$_:\n", map(" $_\n", map(join('-', @$_), @{ $Pairs{$_} })), "\n"; } #### push @{ $First{ $A[$_] } }, $_ for (0..$#A); push @{ $Second{ $B[$_] } }, $_ for (0..$#B); #### for my $Common (grep {exists $Second{$_}} keys %First){ #### for my $Idx (@{ $First{$Common} }){ push @{ $Pairs{$Common} }, map([$Idx, $_], @{ $Second{$Common} }); } #### $Pairs{Each Common Value} = [ [A1, B1], [A1, B2], [A2, B1], [A2, B2] ] #### $Pairs{4} = [[3,1], [3,7], [5,1], [5,7]] #### 2: 1-0 1-8 7-0 7-8 9-0 9-8 4: 3-1 3-7 5-1 5-7