Beefy Boxes and Bandwidth Generously Provided by pair Networks
Perl Monk, Perl Meditation

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

by LanX (Archbishop)
on Feb 18, 2015 at 01:39 UTC ( #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?

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

How do I use this? | Other CB clients
Other Users?
Others surveying the Monastery: (5)
As of 2019-10-16 05:02 GMT
Find Nodes?
    Voting Booth?