print($regexp) Expect Gives
-------------- ------------ ----------
\Q*\E\Q*\E \*\* \*\Q*\E
\Q**LOL** \*\*LOL\*\* \Q**LOL**
\\Quit\\Exit \\Quit\\Exit \Quit\Exit
\Qfoo\\E foo\\\\E foo\\
Solution:
my $in_quote = 0;
$regexp =~ s/([^\\]|\\.)/
if ($in_quote) {
if ($1 eq '\\E') {
$in_quote = 0;
''
} else {
quotemeta($1)
}
} else {
if ($1 eq '\\Q') {
$in_quote = 1;
''
} else {
$1
}
}
/eg;
Update: Alternative:
$regexp =~ s/
\G
(
(?:[^\\]|\\[^Q])*
)
(?:
\\Q
(?:[^\\]|\\[^E])*
(?:\\E)?
)?
/
$1 . (defined($2) ? quotemeta($2) : '')
/xge;
Neither snippet is fully tested. In fact, both are known to be unable to handle regexps in which (?{...}) or (?{{...}}) are used. What's wrong with what I suggested in my earlier post?
|