What is /o really for?

Under the current implementation, using a variable in a pattern match forces a re-evaluation (and perhaps recompilation) each time through. The /o modifier locks in the regex the first time it's used. This always happens in a constant pattern, and in fact, the pattern was compiled into internal format at the same time your entire program was. Use of /o is irrelevant unless variable interpolation is used in the pattern, and if so, the regex engine will neither know nor care whether the variables change after the pattern is evaluated the very first time.

/o is often used to gain an extra measure of efficiency by not performing subsequent evaluations when you know it won't matter (because you know the variables won't change), or more rarely, when you don't want the regex to notice if they do.

For example, here's a ``paragrep'' program:

    $/ = '';  # paragraph mode
    $pat = shift;
    while (<>) {
        print if /$pat/o;
    }