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};