#!/usr/bin/perl use strict; use warnings; use diagnostics; use Data::Dumper; my $text = '3,6-10,16,23'; my $list = &_text_to_list($text); print Dumper $list; exit; sub _text_to_list { my @list = split( ',', shift ); my @expanded = map { /^(\d+)-(\d+)$/ ? ($1 .. $2) : /^(\d+)$/ ? ($1) : () } @list; my %hash = map { $_ => 1 } @expanded; @list = sort { $a <=> $b } keys %hash; return \@list; }