use strict; use warnings; my @list = sort {$a <=> $b} (1, 2, 3, 6, 9, 10, 13, 22, 20, 19, 15, 21); printf "%s\n", join(",", @list); my @newList; my ($min, $max); for(@list, undef) { if(! defined($min)) { $min = $max = $_; } elsif(defined($_) && $_ == ($max + 1)) { $max++ } else { if($min == $max) { push @newList, ($min, $_) } else { push @newList, ("$min-$max", $_) } $min = $max = undef; } } pop @newList; printf "%s\n", join(",", @newList);