Beefy Boxes and Bandwidth Generously Provided by pair Networks
Keep It Simple, Stupid
 
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 surveying the Monastery: (3)
As of 2024-03-28 13:57 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found