perldoc perlre says this:
(If a curly bracket occurs in any other context and does not form part of a backslashed sequence like
\x{...}, it is treated as a regular character. However, a deprecation warning is raised for all such occurrences, and in Perl v5.26, literal uses of a curly bracket will be required to be escaped, say by preceding them with a backslash ("\{") or enclosing them within square brackets ("[{]"). This change will allow for future syntax extensions (like making the lower bound of a quantifier optional), and better error checking of quantifiers.)
OK, so the following prints the deprecation message.
perl -lE 'm/x{x}/'
Why doesn't the following?
perl -lE 'm/x({x})/'
e.g. in the capture group is the { allowed unescaped? Probably not because
perl -lE 'm/x(x{x})/'
also prints the warning.
So, what is the exact "logic"?
P.S.: I will escape every literal {, but am wondering about the rationale behind the above.
The warning is only emitted when the curly:
\b{}, \B{}, \g{}, \k{}, \N{}, \o{}, \p{}, \P{}, or \x{}
{n}, {n,}, or {n,m}, where n and m are positive integersSee regcomp.c in the Perl source (the below is from 5.22.0):
case '{':
/* Currently we don't warn when the lbrace is at the start
* of a construct. This catches it in the middle of a
* literal string, or when its the first thing after
* something like "\b" */
if (! SIZE_ONLY
&& (len || (p > RExC_start && isALPHA_A(*(p -1)))))
{
ckWARNregdep(p + 1, "Unescaped left brace in regex is deprecated, passed through");
}
/*FALLTHROUGH*/
default: /* A literal character */
normal_default:
if (UTF8_IS_START(*p) && UTF) {
STRLEN numlen;
ender = utf8n_to_uvchr((U8*)p, RExC_end - p,
&numlen, UTF8_ALLOW_DEFAULT);
p += numlen;
}
else
ender = (U8) *p++;
break;
} /* End of switch on the literal */
Demo:
$ perl -e '/{/' # Beginning of pattern, no warning
$ perl -e '/.{/' # Doesn't follow alpha, no warning
$ perl -e '/x{3}/' # Valid quantifier, no warning
$ perl -e '/\x{/' # Part of special escape sequence \x{}, different warning
Missing right brace on \x{} in regex; marked by <-- HERE in m/\x{ <-- HERE / at -e line 1.
$ perl -e '/x{/' # Follows alpha, isn't a quantifier or special escape, warns
Unescaped left brace in regex is deprecated, passed through in regex; marked by <-- HERE in m/x{ <-- HERE / at -e line 1.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With