use strict; sub list_to_ranges { sort @_; my $last = shift; my $list = "$last"; my $span = 1; foreach my $next (@_) { if( $next == $last + 1 ) { $span++; next; } else { $list .= ($span>1?"-$next":",$next"); $span = 1; $last = $next; } } return $list; } print list_to_ranges( 2,3,4,8,10,11,12,15 ), "\n"; print list_to_ranges( 2,3,4,8,10,11,12,15 ), "\n"; print list_to_ranges( 8,10,11,12,15 ), "\n";