според мен точно този регулярен е това, което трябва. дори да допуснем, че имаш "бързо напускане" (last), пак е по-бавно от регулярната машина:
#!/usr/bin/perl
use strict;
use Benchmark qw(:all);
$main::string = 'aaaaaaaaaa';
$main::buffer = 'a';
@main::array_full = split '', $main::string;
@main::array_part = qw(a b a a a a a a a a);
my $result = timethese(10_000_000, {
'equal_full' => '$main::buffer eq $_ or last for @main::array_full;',
'equal_part' => '$main::buffer eq $_ or last for @main::array_part;',
'regex' => '$main::string =~ /^\Q$main::buffer\E+$/o',
});
cmpthese( $result );
__END__
stdout:
Benchmark: timing 10000000 iterations of equal_full, equal_part, regex...
equal_full: 58 wallclock secs (28.92 usr + 0.13 sys = 29.05 CPU) @ 344234.08/s (n=10000000)
equal_part: 11 wallclock secs ( 8.98 usr + 0.00 sys = 8.98 CPU) @ 1113585.75/s (n=10000000)
regex: 9 wallclock secs ( 8.05 usr + -0.01 sys = 8.04 CPU) @ 1243781.09/s (n=10000000)
Rate equal_full equal_part regex
equal_full 344234/s -- -69% -72%
equal_part 1113586/s 223% -- -10%
regex 1243781/s 261% 12% --
а може би не съм разбрал условието?