use strict; use warnings; my @nums = get_numbers_from_ranges ('2,10-13,2-5'); print "@nums"; sub get_numbers_from_ranges { my @ranges = split ',', shift; my @numbers; my %seen; for my $range (@ranges) { my ($start, $end) = sort {$a <=> $b} split '-', $range; $end ||= $start; ! $seen{$_}++ and push @numbers, $_ for $start .. $end; } return @numbers; } #### 2 10 11 12 13 3 4 5