# some are shared by others... @array1 = (1 .. 100001); @array2 = (100001 .. 200001); @array3 = (200001 .. 300000); for $i ( 1 .. 100000, 1 .. 10000 ) { $a = int( rand( 3 ) ) + 1; # dark magic, beware... push @array4, ${*{"array$a"}}[$i]; } my %which; do { push @{ $which{$_} } => "array1" } for @array1; do { push @{ $which{$_} } => "array2" } for @array2; do { push @{ $which{$_} } => "array3" } for @array3; my @pairs = @array4; while (my ($one,$two) = splice(@pairs,0,2)) { print "." if "$one and $two are in (@{$which{$one}}) and (@{$which{$two}}) respectively\n"; } __END__ This renders (on my box): 4.05user 0.15system 0:04.31elapsed 97%CPU (0avgtext+0avgdata 0maxresident)k 0inputs+0outputs (0major+22995minor)pagefaults 0swaps