But i dont think this will scale very well... (and probably has
subtle problems anyway)
One quibble is that because \d is a subset of \w then a string
such as "abc123def" will get \w{9} in your version.
Here's a slightly improved version (for some definition of improved)
my $string=" \aabc123def!*#\n";
$string=~s{ ([[:digit:]]+)
|([[:alpha:]]+)
|([[:punct:]]+)
|([[:space:]]+)
|([[:cntrl:]]+)
|(.)
}
{
defined($1) ? '[[:digit:]]{'.length($1).'}'
: defined($2) ? '[[:alpha:]]{'.length($2).'}'
: defined($3) ? '[[:punct:]]{'.length($3).'}'
: defined($4) ? '[[:space:]]{'.length($4).'}'
: defined($5) ? '[[:cntrl:]]{'.length($5).'}'
: "\Q$+\E" # anything else?
}gex;
print $string;
But it still has problems (for example, \n is in both :space: and
:cntrl: so "\n\a" produces [[:space:]]{1}[[:cntrl:]]{1},
but "\a\n" produces [[:cntrl:]]{2}).