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

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

Replies are listed 'Best First'.
Re^6: Precompiling qr/.../o question
by ikegami (Patriarch) on Apr 08, 2008 at 04:13 UTC

    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)'