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.
¹) IMHO the cleanest and still unmentioned in this thread :)
In Section
Meditations