Just to chime in with my own version,
1-10, 500x: 2 secs ( 1.13 usr 0.00 sys = 1.13 cpu) (printing)
1-10, 500x: 1 secs ( 0.48 usr 0.00 sys = 0.48 cpu) (not printing)
1-35m 10x: 26 secs (26.53 usr 0.00 sys = 26.53 cpu) (printing)
1-35, 10x: 15 secs (15.05 usr 0.00 sys = 15.05 cpu) (not printing)
My approach is similar to several of the ones already posted, but differs enough that I figured I might as well post it:
$x = 1;
$x =~ s/((.)\2*)/length($1).$2/ge;
Uncomment that print line to print everything out. And, of course, get rid of the array-de-ref function call if you don't care about spaces between the numbers.
Incidentally, I used the array ref so I could take advantage of $" being a space and not have to worry about mapping the numbers so they'd have spaces between them.