#!/usr/bin/perl use strict; use warnings; use Data::Dumper; my $text = '1-20,1,1,1,2,4,5,8,9,3-4'; my $list = _text_to_list( $text ); print Dumper $list; sub _text_to_list { my $text = shift; my %numbers; my @list = split /,/, $text; for (@list) { my @range = split /-/; $range[1] = defined $range[1] ? $range[1] : $range[0]; $numbers{$_} = 1 for $range[0] .. $range[1]; } return [sort {$a <=> $b} keys %numbers]; }