in reply to $str to %hash to @ary

If you want to keep your hash structure, here are 2 alternatives that do not lose data:

The first one uses the ad# as the key (inverse of your example).
The second one uses the percent as key, but stores the Ad#'s as Values in a HOA.

#First way - Ad# as key: my $str='27:43:33:21:23:19:27:6'; my( $temp,%h); %h= map {if($temp){ my $y=$temp; $temp=undef; $_=>$y }else{ $temp=$_; undef()=>undef; } } split/:/,$str; delete $h{undef()}; print qq($_=>$h{$_}\n) for keys %h; #Second way - using a HOA my $str='27:43:33:21:23:19:27:6'; my( $temp,%h); for ( split/:/,$str){ if($temp){ push @{$h{$temp}},$_; $temp=undef; }else{ $temp=$_; } }; print qq($_=> @{$h{$_}}\n) for keys %h;

    Earth first! (We'll rob the other planets later)