Beefy Boxes and Bandwidth Generously Provided by pair Networks
good chemistry is complicated,
and a little bit messy -LW

Re: Trying to count the captures in a compiled regular expression

by hv (Parson)
on May 03, 2004 at 02:11 UTC ( #349900=note: print w/ replies, xml ) Need Help??

in reply to Trying to count the captures in a compiled regular expression

With respect to (?xism-xism:...), beware of the docs for this (my emphasis):

One or more embedded pattern-match modifiers, to be turned on (or turned off, if preceded by "-") for the remainder of the pattern or the remainder of the enclosing pattern group (if any).
If I understand that correctly, the "only look at openings" approach will fail on something like:
/(?x:((?-x:)) # (comment) )/
/((?-x:)) # (comment) /x

The simplistic (?{...}) parsing I referred to is in toke.c:scan_const(); look for the test

else if (s[2] == '{' /* This should match regcomp.c */ || ((s[2] == 'p' || s[2] == '?') && s[3] == '{'))
which simply counts unescaped braces until the opening one is closed - something like:
our $re_true = qr{(?=)}x; our $re_false = qr{(?!)}x; our $count; / # (?{ ... }) or (??{ ... }) or (legacy) (?p{ ... }) \G \( \? (?: \? \?? | p ) (?= \{ ) (?{ local $count = 0; }) (?: \{ (?{ local $count = $count + 1 }) | \} (?{ local $count = $count - 1 }) | \\ . | . )+? (??{ $count == 0 ? $re_true : $re_false }) /xgc;
would be fitting, though I suspect there must be a simpler way.

(consider how lucky I am that the regular expression engine is not reentrant...)

Now now, no need for that sort of language.


Replies are listed 'Best First'.
Re: Re: Trying to count the captures in a compiled regular expression
by BooK (Curate) on May 03, 2004 at 06:50 UTC

    My opinion on (?{ ... }) was that I needed to know how Perl did it to make sure I'd do it right. I'm glad you answered: it proves I was not the only one wanting it to work the hard way. ;-)

    Thanks to Roy Johnson below, I guess I'll blend in a does of simplicity in my code. There's still a bug somewhere, though.

    Well, at least I can keep the test suite. *sigh*

Log In?

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

How do I use this? | Other CB clients
Other Users?
Others cooling their heels in the Monastery: (11)
As of 2016-06-27 16:27 GMT
Find Nodes?
    Voting Booth?
    My preferred method of making French fries (chips) is in a ...

    Results (340 votes). Check out past polls.