This was a question on the perl quiz of the week that ran for a few months last year. Question #6 asks exactly what you are looking for.
Here is MJDs summary.
The shortest solution was provided by Andreas Koenig:
use Set::IntSpan; # CPAN rules :-)
use strict;
sub expand_number_list {
my $run = shift;
my $set = Set::IntSpan->new($run);
$set->elements;
}
Here is a list of everyone else's submisions.
Update: Silly me, I included Andreas' answer for expand_number_list by mistake! Here is the one you are looking for:
use Set::IntSpan; # CPAN rules :-)
use strict;
sub format_number_list {
my(@n) = @_;
my $set = Set::IntSpan->new(join ",", @n);
my $run = $set->run_list;
$run =~ s/,/, /g; # give them the spaces
$run;
}