my @numbers = qw( 22 19 8 22 4 2 8 12 5 6 21 23 1 ); print "Input(@numbers)\n"; printf "Output(%s)\n", numbers_to_ranges(@numbers); sub numbers_to_ranges { map$x[$_]=$_,@_;$_="@x";s@^ +@@;s*(\d+)( (\d+))+*\1-\3*g;s- +-, -g;$_ } __END__ [Results] Input(22 19 8 22 4 2 8 12 5 6 21 23 1) Output(1-2, 4-6, 8, 12, 19, 21-23