my @sorted = map{ $_ = $_->[0] } sort { if($a->[2] and $b->[2]) { $_ = $a->[2] cmp $b->[2]; } elsif($a->[2] and !$b->[2]) { $_ = 1; } elsif(!$a->[2] and $b->[2]) { $_ = -1; } else { $_ = $a->[1] <=> $b->[1]; } } map { my ($n) = $_ =~ /chr(\d+)/; my ($s) = $_ =~ /chr(\D+)/; $s = '' if( !$s ); $n = 0 if( !$n ); $_ = [$_,$n,$s]; } @unsorted;