Beefy Boxes and Bandwidth Generously Provided by pair Networks
Perl: the Markov chain saw
 
PerlMonks  

Re^2: Compiling Regular Expressions

by johndeighan (Novice)
on Mar 11, 2016 at 16:05 UTC ( [id://1157455]=note: print w/replies, xml ) Need Help??


in reply to Re: Compiling Regular Expressions
in thread Compiling Regular Expressions

I want to embed Perl code in my regex using (?{...}), so it's critical that the regex is compiled at compile time. I've gotten this to work without errors or warnings:

my $kind; my $REGEX = qr/ [A-Za-z][\w]* (?{$kind = 'IDENT';}) | (?: ==? | != | <=? | >=? ) (?{$kind = 'OP';}) | -?\d+ (?{$kind = 'INT';}) | \x27 ( (?:[^\x27] | \x27{2})* ) \x27 (?{$kind = 'STRING';}) | \S (?{$kind = 'OTHER';}) /xs;

However, I'd like to better organize the regex by splitting it into parts, then using those parts. This is what I'd like to do, but when I try, I get the error "Eval-group not allowed at runtime, use re 'eval' in regex". I think that the suggested workaround is bad practice, so I won't do it, but I don't understand why what I'm trying to do won't work since all the regex's involved use qr//. I've also tried using Readonly for the parts, but Perl still doesn't recognize that the parts I'm using will never change. Is there any other way to get $REGEX to compile at compile time while breaking it into parts?

my $IDENT = qr/ [A-Za-z][\w]* /xs; my $STRING = qr/ \x27 ( (?:[^\x27] | \x27{2})* ) \x27 /xs; my $OP = qr/ (?: ==? | != | <=? | >=? ) /xs; my $INT = qr/ -?\d+ /xs; my $kind; my $REGEX = qr/ $IDENT (?{$kind = 'IDENT';}) | $OP (?{$kind = 'OP';}) | $INT (?{$kind = 'INT';}) | $STRING (?{$kind = 'STRING';}) | \S (?{$kind = 'OTHER';}) /xs;

Replies are listed 'Best First'.
Re^3: Compiling Regular Expressions
by stevieb (Canon) on Mar 11, 2016 at 17:08 UTC

    You must be using a version of perl that is less than v5.18, as this behaviour works for me on 5.18+, and is documented as such in v5.18 perldelta... search for "The use re 'eval' pragma".

Log In?
Username:
Password:

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

How do I use this?Last hourOther CB clients
Other Users?
Others browsing the Monastery: (5)
As of 2025-03-24 12:22 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?
    When you first encountered Perl, which feature amazed you the most?










    Results (64 votes). Check out past polls.

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