my @input = (1, 2, 3, 5, 6, 8, 10); my $last = $input[0]; my @ranges = map { ($_ > $#input || $input[$_] != 1 + $input[ $_ - 1 ]) ? do { my $s = $last . (":$input[ $_ - 1 ]") x ($last != $input[ $_ - 1 ]); $last = $input[$_]; $s } : (); } 1 .. $#input + 1;