Beefy Boxes and Bandwidth Generously Provided by pair Networks
There's more than one way to do things
 
PerlMonks  

Re: A refactoring trap ( regex /x modifier activates new metacharacters)

by LanX (Saint)
on Feb 18, 2015 at 01:39 UTC ( [id://1117060]=note: print w/replies, xml ) Need Help??


in reply to A refactoring trap

I just ran into the same problem and it took me a while to debug it.

Wanted write a warning thread ... but of course PM had it already, so I just need pushing it up again. =)

Shortly stated: When composing regexes from smaller parts be aware that " " and "#" are real new metacharacters under /x and not only syntactic sugar on the top level.

DB<135> $a='#x' => "#x" DB<136> "x#x#x" =~ s/$a$a/-/r => "x-" DB<137> "x#x#x" =~ s/$a$a/-/xr #oops => "-x#x#x"

"$a$a" becomes "#x#x" which is an empty regex under /x since it starts with a comment.

One solution¹ is to pre-compile the smaller parts w/o x-flag

DB<138> $a=qr/#x/ => qr/#x/ DB<139> "x#x#x" =~ s/$a$a/-/r => "x-" DB<140> "x#x#x" =~ s/$a$a/-/xr => "x-"

another one escaping or using a character class

DB<144> $a='\#x' # or ='[#]x' => "\\#x" DB<145> "x#x#x" =~ s/$a$a/-/r => "x-" DB<146> "x#x#x" =~ s/$a$a/-/xr => "x-"

simply using quotemeta might bite you again when you wanted to use other metacharacters.

NB: same problem with whitespace.

Cheers Rolf

PS: Je suis Charlie!

¹) IMHO the cleanest and still unmentioned in this thread :)

Log In?
Username:
Password:

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

How do I use this?Last hourOther CB clients
Other Users?
Others avoiding work at the Monastery: (6)
As of 2024-04-18 12:04 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found