in reply to Re: Re: regex "o" modifier
in thread regex "o" modifier

nope, you wouldn't benefit from an /o in this case..

qr quotes and compiles the pattern as a regular expression. To see what it's doing, try this:

perl -e 'my $re = qr!yes|no!; print "$re\n";' prints: (?-xism:yes|no)

The result of qr, in this case $re, can be used on it's own, or within another regex.

my $re = qr!yes|no!; print "yes or no!\n" if "yes" =~ $re; print "yes or no only" if "maybe" !~ $re; print "polite yes or no\n" if "yes thankyou" =~ /$re thankyou/;

The first 2 uses in this code will not trigger the recompling of any regex. The 3rd will need to be compiled, although I believe you could do...

my $re = qr!yes|no!; my $re2 = qr!\sthankyou!; print "yes or no!\n" if "yes" =~ $re; print "yes or no only" if "maybe" !~ $re; print "polite yes or no\n" if "yes thankyou" =~ /$re$re2/;

..and avoid any recompilation after the initial qr's

cheers,

J

Replies are listed 'Best First'.
Re: Re: Re: Re: regex "o" modifier
by diotalevi (Canon) on May 07, 2003 at 04:18 UTC

    You'll want to revisit Re^2: meaning of /o in regexes. If you interpolate qr// compiled expressions you lose because the thing is compiled more often than it needs to be. Your "I believe you could do..." is incorrect.

      hmm.. yup, gotcha there.. shouldn't have added that last bit.

      ok.. knew I saw something somewhere.. in "Programming Perl" it has the example:

      $regex = qr/$pattern/; $string =~ /foo${regex}bar/; # interpolate into larger patterns

      ..and then the comment, "This time, Perl does recompile the pattern, but you could always chain several qr// operators together into one."

      So would they maybe be suggesting something more like:

      my $re = qr!yes|no!; my $re2 = qr!\sthankyou!; my $bigre = $re.$re2; print "polite yes or no\n" if "yes thankyou" =~ $bigre;

      hmm.. on further thought, that doesn't seem right either. Would $re & $re2 each be stringified in that operation? If so that would mean that $bigre would simply be eq to the string '(?-xism:yes|no)(?-xism:\sthankyou)'

      The only other thing I can think they mean is:

      my $bigre = qr!yes|no!.qr!\sthankyou!;

      But I really don't see the point in that... Anyone know what they mean by "chain several qr// operators together"?

      cheers,

      J

        It says chaining, not concatenating.
        my $re = qr!yes|no!; my $re2 = qr!${re}\sthankyou!; print "polite yes or no\n" if "yes thankyou" =~ $re2;

        Makeshifts last the longest.