in reply to Re^3: On the regex pattern variable to be inserted into another
in thread On the regex pattern variable to be inserted into another

> to expect that Perl might recognize /$foo/ or /foo/g as being able to re-use a compiled expression instead of compiling a new one.

the first case maybe, tho I'm not sure about the implications of having no modifiers outside but inside.

But how did you prove that /$foo/ is recompiling?

Anyway as I said $str =~ $foo shouldn't! (untested)

Cheers Rolf
(addicted to the Perl Programming Language :)
Wikisyntax for the Monastery

Replies are listed 'Best First'.
Re^5: On the regex pattern variable to be inserted into another (which recompile???)
by LanX (Saint) on Feb 10, 2022 at 21:18 UTC
    > But how did you prove that $foo is recompiling?

    I can't find any proof that anything is recompiled, even with //g.

    D:\>perl -E"my $x; BEGIN{$x=qr/a.*u/}; use re 'debug'; my $str = 'aou' +; say $str =~ /$x/" 1 D:\>perl -E"my $x; BEGIN{$x=qr/a.*u/}; use re 'debug'; my $str = 'aou' +; say $str =~ /$x/g" aou
    Please compare the verbose output if you replace qr// with q//

    D:\>perl -E"my $x; BEGIN{$x=q/a.*u/}; use re 'debug'; my $str = 'aou'; + say $str =~ /$x/" Compiling REx "a.*u" Final program: 1: EXACT <a> (3) 3: STAR (5) 4: REG_ANY (0) 5: EXACT <u> (7) 7: END (0) anchored "a" at 0..0 floating "u" at 1..9223372036854775807 (checking +floating) minlen 2 Matching REx "a.*u" against "aou" Intuit: trying to determine minimum start position... doing 'check' fbm scan, [1..3] gave 2 Found floating substr "u" at offset 2 (rx_origin now 0)... ... YADDA YADDA ...

    So how do you know???

    Cheers Rolf
    (addicted to the Perl Programming Language :)
    Wikisyntax for the Monastery

    update

    And that's whats happening if you have more than one precompiled regex inside the match, like expected.

    D:\>perl -E"my $x; BEGIN{$x=qr/a.*u/}; use re 'debug'; my $str = 'aou' +; say $str =~ /$x$x/" Compiling REx "(?^u:a.*u)(?^u:a.*u)" Final program: 1: EXACT <a> (3) 3: STAR (5) 4: REG_ANY (0) 5: EXACT <ua> (9) 9: STAR (11) 10: REG_ANY (0) 11: EXACT <u> (13) 13: END (0) anchored "a" at 0..0 floating "ua" at 1..9223372036854775807 (checking + floating) minlen 4 String shorter than min possible regex match (3 < 4) Freeing REx: "(?^u:a.*u)(?^u:a.*u)"

    FWIW:

    This is perl 5, version 32, subversion 1 (v5.32.1) built for MSWin32-x +64-multi-t hread
      Well, I take it back, and have updated my answers.

      Perl does special-case  /$foo/g and  s/$foo/.../g to avoid re-compiling. It does not optimize changing the anchor like  /\G$foo/gc, which is the actual code from my module.

      The testing I did at the time was based on performance, rather than specifically tracing whether the compilation got invoked. It could be that evaling a coderef with the expanded regex text still performs better than referencing a compiled regex, but but I don't really have time right now to go back and benchmark it.

        AFAIR Perl caches the previous stringification of the regexp, and compares that against the stringification of the new pattern to determine whether it needs recompiling. The stringification of a compiled pattern always captures those outside flags that affect compile-time so as to make this (and interpolation) safe, that's why you see for example:

        % perl -E 'say qr{foo}i' (?^ui:foo) %

        The /g flag is not listed in the docs because it is not supported by qr{}:

        % perl -E 'say qr{foo}g' Unknown regexp modifier "/g" at -e line 1, near "say " Execution of -e aborted due to compilation errors. %

        (I think that error message could probably be improved. Patches welcome. :)