http://www.perlmonks.org?node_id=1117060


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 :)