#! /usr/bin/perl use warnings; use strict; my @input = (1, 2, 3, 5, 6, 8, 10); my @ranges = ($input[0]); for my $i (1 .. $#input) { warn "\t@ranges"; if ($input[ $i - 1 ] + 1 == $input[$i]) { $ranges[-1] = (split /:/, $ranges[-1])[0] . ":$input[$i]"; } else { push @ranges, $input[$i]; } } use Test::More tests => 1; is_deeply \@ranges, [ '1:3', '5:6', '8', '10' ];