in reply to Re^2: speeding up a regex
in thread speeding up a regex

That depends on a whole lot of factors. In old perls, that was true; modern perls have optimisations to avoid recompiling patterns if the interpolated variables haven’t changed.

However, note that a match such as $foo =~ /$bar/ is magical if $bar is a pattern precompiled with qr, in that the pattern compilation phase is skipped completely. (This applies when the pattern consists of nothing but the interpolated variable.)

And finally, the (?{}) delayed evaluation construct lets you embed pre-compiled patterns in another pattern without recompiling the embedded pattern.

Makeshifts last the longest.

Replies are listed 'Best First'.
Re^4: speeding up a regex
by Perl Mouse (Chaplain) on Jan 03, 2006 at 16:04 UTC
    modern perls have optimisations to avoid recompiling patterns if the interpolated variables haven’t changed
    Modern perls are even smarter than that. They look at the string after interpolation, and if that's the same, the regex isn't executed:
    $ cat xx #!/usr/bin/perl use strict; use warnings; foreach my $x (["foo", "bar"], ["fo", "obar"]) { my ($foo, $bar) = @$x; "" =~ /$foo/; "" =~ /$foo$bar/; } __END__ $ perl -Dr xx 2>&1 | perl -nle 'if (/EXECUTING/ .. eof) {print if/^Compiling/}' Compiling REx `foo' Compiling REx `foobar' Compiling REx `fo'
    Perl won't recompile the second regex, since while the values of both $foo and $bar have changed, the value of "$foo$bar" hasn't.
    Perl --((8:>*