Beefy Boxes and Bandwidth Generously Provided by pair Networks
We don't bite newbies here... much
 
PerlMonks  

Re^4: Precompiling qr/.../o question

by mr_mischief (Monsignor)
on Apr 04, 2008 at 17:31 UTC ( [id://678417]=note: print w/replies, xml ) Need Help??


in reply to Re^3: Precompiling qr/.../o question
in thread Precompiling qr/.../o question

Your question is one of scope, I think. Setting $foo to a compiled regex once per loop, then using it in many matches and/or substitutions later in the loop is one thing. Setting it to not recompile even when otherwise told to do so is another. We could discuss at great length the merits and faults with having those two options, but precompiling the regex once per loop iteration for a loop with two dozen matches using that regex I think still makes sense.

Replies are listed 'Best First'.
Re^5: Precompiling qr/.../o question
by ack (Deacon) on Apr 08, 2008 at 03:52 UTC

    I didn't realize that the compiler was re-invoked after every loop. I thought the compilation takes place before the entire script is executed (or, I guess more correctly, I should say 'interpreted'). I didn't realize that the decision to compile the regex is done on every pass through the loop.

    Certainly, with the regex compilation decision being invoked on every pass throught the loop, I would absolutely agree that it makes sense to, as you said "...precompiling the regex once per loop iteration for a loop with two dozen matches using that regex I think still makes sense...". That would, as you noted, be much more efficient than having to re-compile on every instance of regex throughout the loop...especially if you had many instances in the loop of using that regex.

    Thanks. I really appreciate your helping me dig deeper into and learn more about the magic of regex's.

    ack Albuquerque, NM

      I didn't realize that the compiler was re-invoked after every loop

      It's not. Looping has nothing to do with it, for starters.

      The regexp compiler is invoked every time a qr//, m// or s/// operator is invoked (and more?), if the regexp has changed since the last time that match or substitute operator has been invoked.

      For example, notice there's no "Compiling" message on the third pass, no matter whether qr// or m// is used.

      >perl -Mre=debug -e"/$_/ for qw( foo bar bar foo )" 2>&1 | find "Compi +ling" Compiling REx `foo' Compiling REx `bar' Compiling REx `foo' >perl -Mre=debug -e"qr/$_/ for qw( foo bar bar foo )" 2>&1 | find "Com +piling" Compiling REx `foo' Compiling REx `bar' Compiling REx `foo'

      A regexp compiled with qr// won't get recompiled when it's included in m// or s/// if it the regexp operand consist entirely of the qr// regexp. However, it might be recompiled when interpolated into another regexp.

      >perl -Mre=debug -e"$re=qr/foo/; /$re/" 2>&1 | find "Compiling" Compiling REx `foo' >perl -Mre=debug -e"$re=qr/foo/; /a$re/" 2>&1 | find "Compiling" Compiling REx `foo' Compiling REx `a(?-xism:foo)'

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://678417]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others chanting in the Monastery: (7)
As of 2024-03-28 13:53 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found