use strict; use warnings; my $rangeStr = q{2,10-13,2-5, 7, 32-28,12 , 18 - 23, 31-35}; my %seen = (); my @expandedRange = grep { not $seen{ $_ } ++ } map { m{(\d+)\s*-\s*(\d+)} ? $2 > $1 ? $1 .. $2 : reverse $2 .. $1 : $_; } split m{\s*,\s*}, $rangeStr; print qq{@expandedRange\n}; #### 2 10 11 12 13 3 4 5 7 32 31 30 29 28 18 19 20 21 22 23 33 34 35