use List::AllUtils qw/reduce/; my @list = sort {$a <=> $b} (1, 2, 3, 6, 9, 10, 13, 22, 20, 19, 15, 21); print reduce { if(my ($sign,$last) = $a =~ /([,-]?)(\d+)$/){ if( $last+1 == $b ) { $a =~ s/[,-]?\d+$// if($sign eq '-'); $a.= "-$b"; } else { $a.=",$b"; }; }; $a; }@list;