Did you try
tr/a-zA-Z89//cd;? I would expect it to be
much faster than
s///.
Update - quick benchmark:
use strict;
use warnings;
use Benchmark qw/cmpthese/;
my $str;
$str .= chr(rand( 96 ) + 32) for 1 .. 1000;
my $d;
sub trans { ($d = $str) =~ tr/a-zA-Z89 //cd; $d }
sub justg { ($d = $str) =~ s/[^a-zA-Z8-9 ]//g; $d }
sub ig { ($d = $str) =~ s/[^a-z8-9 ]//ig; $d }
sub igplus{ ($d = $str) =~ s/[^a-z8-9 ]+//ig; $d }
sub gplus { ($d = $str) =~ s/[^a-zA-Z8-9 ]+//g; $d}
#print join "\n", trans, justg, ig, igplus, gplus;
cmpthese ( 100_000, {
trans => \&trans,
justg => \&justg,
ig => \&ig,
gplus => \&gplus,
igplus => \&igplus,
});
__END__
Output:
Rate justg ig igplus gplus trans
justg 4442/s -- -2% -19% -22% -93%
ig 4529/s 2% -- -18% -20% -92%
igplus 5499/s 24% 21% -- -3% -91%
gplus 5674/s 28% 25% 3% -- -91%
trans 60168/s 1255% 1229% 994% 960% --
I ran it with strings of 10 char, 100, then 1000. The longer the string, the bigger the difference between tr/// and s///.