my %vhash; foreach (@array1){ # Each $vhash{N} says how many times N showed up in array1 $vhash{$_}++}; foreach (@array2){ # Each appearance of N in array2 knocks down its count in vhash if(! exists $vhash{$_}){ print "Found too many $_ in array2"; exit} elsif($vhash{$_}==1){ delete $vhash{$_)} else{$vhash{$_}--}; if(keys %vhash){ print "Found too many ", join(' ', keys %vhash), "in array1\n"} else{ print "Yep, they matched!\n"}