I have no solution to the eval problem, but FWIW, MO=Deparse,-p clarifies the issue:
Likewise for \Q...\E:% perl -MO=Deparse,-p -le '$patt = "a\Ubc"; print qr/$patt/' BEGIN { $/ = "\n"; $\ = "\n"; } ($patt = 'aBC'); print(qr/$patt/); -e syntax OK
In other words, by the time that qr sees it, perl has already transformed the original string, which explains both the problem and the eval workaround.% perl -MO=Deparse,-p -le '$patt = "a\Q[bc]\E"; print qr/$patt/' BEGIN { $/ = "\n"; $\ = "\n"; } ($patt = 'a\\[bc\\]'); print(qr/$patt/); -e syntax OK
Note that this behavior occurs only if the RHS of the first assignment is double-quoted; with single-quotes you end up with the same problem as if the pattern had been passed in in @ARGV:
% perl -le '$patt = q(a\Ubc); print qr/$patt/' (?-xism:a\Ubc)
Update: Deleted a bit of stray text that had snuck into one of the original code snippets; added the output for the \Q...\E case.
the lowliest monk
In reply to Re: qr/string/ is not the same as qr/$var/ ?
by tlm
in thread qr/string/ is not the same as qr/$var/ ?
by grinder
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |