($left,$middle,$right) = $sequence =~ m/(\w{$_})?(\w{1})?(\w*)/; #### use strict; use warnings; use Benchmark qw(cmpthese); my $iterations = shift @ARGV || 5000; my $sequence_size = shift @ARGV || 10; # Simplistic random sequence my $sequence = join '', map {chr(65 + rand(26))} 1..$sequence_size; cmpthese($iterations,{ re_orig => \&re_orig, re_set => \&re_set, bsubstr => \&bsubstr, }); # Test using the original regex sub re_orig { for my $i (0..length($sequence)-1) { my ($left,$middle,$right) = $sequence =~ m/(\w{$i})?(\w{1})?(\w*)/; } } # Test using the character set [A-Z] sub re_set { for my $i (0..length($sequence)-1) { my ($left,$middle,$right) = $sequence =~ m/([A-Z]{$i})([A-Z])([A-Z]*)/; } } # Test using substr sub bsubstr { for my $i (0..length($sequence)-1) { my ($left) = substr($sequence,0,$i); my ($middle) = substr($sequence,$i,1); my ($right) = substr($sequence,$i+1); } }