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); my $count = 0; foreach(@list) { if(! defined($min)) { $min = $_; $max = $_; } elsif($_ == ($max + 1) && $count != $#list) { $max++ } else { if($min == $max) { push @newList, ($min, $_) } else { push @newList, ("$min-$max", $_) } $min = undef; $max = undef; } $count++; } printf "%s\n", join(",", @newList);