while () { chomp; print join(" + ", expand($_)), $/; } sub expand { my $input = shift; $input =~ s/[^-\d,]+//g; $input =~ s/-/../g; my ( %tmp, @tmp ); @tmp = ( eval "$input" ); @tmp{@tmp} = (1) x @tmp; # dedupe return sort { $a <=> $b } keys %tmp; } __DATA__ 1,7-10,3-5,15 or even ... my $input = "1,7-10,3-5,15";