Beefy Boxes and Bandwidth Generously Provided by pair Networks
Pathologically Eclectic Rubbish Lister
 
PerlMonks  

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

by hv (Prior)
on May 03, 2004 at 02:11 UTC ( [id://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) )/
or
/((?-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.

Hugo

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?
Username:
Password:

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

How do I use this?Last hourOther CB clients
Other Users?
Others drinking their drinks and smoking their pipes about the Monastery: (6)
As of 2025-06-17 08:36 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found

    Notices?
    erzuuliAnonymous Monks are no longer allowed to use Super Search, due to an excessive use of this resource by robots.