http://www.perlmonks.org?node_id=457358


in reply to Re: regex to remove all non a-z and spaces
in thread regex to remove all non a-z and spaces

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///.