What potential overhead? Perl will *not* recompile the regex
in each iteration (unless you modify $from or $len). Here's
a proof, assuming the program is in the file /tmp/qq:
$ perl -Dr /tmp/qq 2>&1 | grep Compiling
Compiling REx `^(.{2}).{2}(.*)$'
$
It only gets compiled once.
Here's a benchmark:
#!/usr/bin/perl
use strict;
use warnings;
use Benchmark 'cmpthese';
our @data = <DATA>;
chomp @data;
our $from = 2;
our $len = 2;
our (@a, @b, @c);
cmpthese -10 => {
substr => 'for (@a = @data) {
substr $_, $from, $len, "" if length ($_) >= $fro
+m + $len
}',
regex => 'for (@b = @data) {
$_ = $1 . $2 if /^(.{$from}).{$len}(.*)$/;
}',
regex_qr => 'my $qr = qr /^(.{$from}).{$len}(.*)$/;
for (@c = @data) {
$_ = $1 . $2 if /$qr/;
}',
};
die "Unequal" unless "@a" eq "@b" && "@b" eq "@c";
__DATA__
12345678
yellow
a
xx
yyy
a somewhat longer line to compensate for the smaller lines.
bla bla bla bla
Rate regex_qr regex substr
regex_qr 38207/s -- -3% -62%
regex 39497/s 3% -- -60%
substr 99555/s 161% 152% --
Abigail |