@start = (1,2,8,9,10,11,12,43,66,109,121,122,123,657); @queue = (); @output = (); print 'start :: ' , join(',',@start) , "\n"; foreach (@start) { if( ($_ - $queue[-1]) == 1 ) { # part of sequence push @queue, $_; } else { # store sequence push @output , (@queue > 2) ? $queue[0] . '-' . $queue[-1] : @queue; @queue = ($_); } } push @output , (@queue > 3) ? $queue[0] . '-' . $queue[-1] : join( ',' , @queue ); print 'Expected :: 1,2,8-12,43,66,109,121-123,657' , "\n"; print 'End :: ' , join(',', @output);