X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=pod%2Fperldiag.pod;h=edccac13485ad97a324dd361ef3462d97443ed5b;hb=8162142bfe8ad55439ff878b28c85e654d9a67d3;hp=486a5156a57803fdd75cf001af079da830e04253;hpb=ff3f963aa0f95ea53996b6a3842b824504b57c79;p=p5sagit%2Fp5-mst-13.2.git diff --git a/pod/perldiag.pod b/pod/perldiag.pod index 486a515..edccac1 100644 --- a/pod/perldiag.pod +++ b/pod/perldiag.pod @@ -1159,11 +1159,6 @@ that is already inside a group with a byte-order modifier. For example you cannot force little-endianness on a type that is inside a big-endian group. -=item Can't use keyword '%s' as a label - -(F) You attempted to use a reserved keyword, such as C or C, -as a statement label. This is disallowed since Perl 5.11.0. - =item Can't use "my %s" in sort comparison (F) The global variables $a and $b are reserved for sort comparisons. @@ -1457,6 +1452,14 @@ there are neither package declarations nor a C<$VERSION>. long for Perl to handle. You have to be seriously twisted to write code that triggers this error. +=item Deprecated character(s) in \\N{...} starting at '%s' + +(D deprecated) Just about anything is legal for the C<...> in C<\N{...}>. +But starting in 5.12, non-reasonable ones that don't look like names are +deprecated. A reasonable name begins with an alphabetic character and +continues with any combination of alphanumerics, dashes, spaces, parentheses or +colons. + =item Deprecated use of my() in false conditional (D deprecated) You used a declaration similar to C. @@ -1497,8 +1500,8 @@ do. See L. =item (Did you mean &%s instead?) -(W) You probably referred to an imported subroutine &FOO as $FOO or some -such. +(W misc) You probably referred to an imported subroutine &FOO as $FOO or +some such. =item (Did you mean "local" instead of "our"?) @@ -1912,7 +1915,7 @@ about 250 characters for simple names, and somewhat more for compound names (like C<$A::B>). You've exceeded Perl's limits. Future versions of Perl are likely to eliminate these arbitrary limitations. -=item Ignoring zero length \N{} in character class" +=item Ignoring zero length \N{} in character class (W) Named Unicode character escapes (\N{...}) may return a zero length sequence. When such an escape is used in a character class @@ -2474,7 +2477,10 @@ immediately after the switch, without intervening spaces. =item Missing braces on \N{} (F) Wrong syntax of character name literal C<\N{charname}> within -double-quotish context. +double-quotish context. This can also happen when there is a space (or +comment) between the C<\N> and the C<{> in a regex with the C modifier. +This modifier does not change the requirement that the brace immediately follow +the C<\N>. =item Missing comma after first argument to %s function @@ -2512,32 +2518,32 @@ can vary from one line to the next. (F) Missing right brace in C<\x{...}>, C<\p{...}>, C<\P{...}>, or C<\N{...}>. -=item Missing right brace on \\N{} or unescaped left brace after \\N. Assuming the latter +=item Missing right brace on \\N{} or unescaped left brace after \\N + +(F) +C<\N> has two meanings. -(W syntax) -C<\N> has traditionally been followed by a name enclosed in braces, -meaning the character (or sequence of characters) given by that name. +The traditional one has it followed by a name enclosed +in braces, meaning the character (or sequence of characters) given by that name. Thus C<\N{ASTERISK}> is another way of writing C<*>, valid in both -double-quoted strings and regular expression patterns. -In patterns, it doesn't have the meaning an unescaped C<*> does. +double-quoted strings and regular expression patterns. In patterns, it doesn't +have the meaning an unescaped C<*> does. -Starting in Perl 5.12.0, C<\N> also can have an additional meaning in patterns, -namely to match a non-newline character. (This is like C<.> but is not -affected by the C modifier.) +Starting in Perl 5.12.0, C<\N> also can have an additional meaning (only) in +patterns, namely to match a non-newline character. (This is short for +C<[^\n]>, and like C<.> but is not affected by the C regex modifier.) This can lead to some ambiguities. When C<\N> is not followed immediately by a -left brace, Perl assumes the "match non-newline character" meaning. Also, if +left brace, Perl assumes the C<[^\n]> meaning. Also, if the braces form a valid quantifier such as C<\N{3}> or C<\N{5,}>, Perl assumes that this means to match the given quantity of non-newlines (in these examples, -3, and 5 or more, respectively). In all other case, where there is a C<\N{> +3; and 5 or more, respectively). In all other case, where there is a C<\N{> and a matching C<}>, Perl assumes that a character name is desired. However, if there is no matching C<}>, Perl doesn't know if it was mistakenly -omitted, or if "match non-newline" followed by "match a C<{>" was desired. -It assumes the latter because that is actually a valid interpretation as -written, unlike the other case. If you meant the former, you need to add the -matching right brace. If you did mean the latter, you can silence this warning -by writing instead C<\N\{>. +omitted, or if C<[^\n]{> was desired, and +raises this error. If you meant the former, add the right brace; if you meant +the latter, escape the brace with a backslash, like so: C<\N\{> =item Missing right curly or square bracket @@ -2626,10 +2632,39 @@ local() if you want to localize a package variable. =item \\N in a character class must be a named character: \\N{...} -The new (5.12) meaning of C<\N> to match non-newlines is not valid in a -bracketed character class, for the same reason that C<.> in a character class -loses its specialness: it matches almost everything, which is probably not what -you want. +(F) The new (5.12) meaning of C<\N> as C<[^\n]> is not valid in a bracketed +character class, for the same reason that C<.> in a character class loses its +specialness: it matches almost everything, which is probably not what you want. + +=item \\N{NAME} must be resolved by the lexer + +(F) When compiling a regex pattern, an unresolved named character or sequence +was encountered. This can happen in any of several ways that bypass the lexer, +such as using single-quotish context, or an extra backslash in double quotish: + + $re = '\N{SPACE}'; # Wrong! + $re = "\\N{SPACE}"; # Wrong! + /$re/; + +Instead, use double-quotes with a single backslash: + + $re = "\N{SPACE}"; # ok + /$re/; + +The lexer can be bypassed as well by creating the pattern from smaller +components: + + $re = '\N'; + /${re}{SPACE}/; # Wrong! + +It's not a good idea to split a construct in the middle like this, and it +doesn't work here. Instead use the solution above. + +Finally, the message also can happen under the C regex modifier when the +C<\N> is separated by spaces from the C<{>, in which case, remove the spaces. + + /\N {SPACE}/x; # Wrong! + /\N{SPACE}/x; # ok =item Name "%s::%s" used only once: possible typo @@ -2646,7 +2681,8 @@ will not trigger this warning. =item Invalid hexadecimal number in \\N{U+...} (F) The character constant represented by C<...> is not a valid hexadecimal -number. +number. Either it is empty, or you tried to use a character other than 0 - 9 +or A - F, a - f in a hexadecimal number. =item Negative '/' count in unpack @@ -4844,6 +4880,14 @@ modifier is not presently meaningful in substitutions. use the /g modifier. Currently, /c is meaningful only when /g is used. (This may change in the future.) +=item Use of := for an empty attribute list is deprecated + +(D deprecated) The construction C currently +parses correctly in perl, being equivalent to C +(applying an empty attribute list to C<$x>). This useless +construct is now deprecated, so C<:=> can be reclaimed as a new +operator in the future. + =item Use of freed value in iteration (F) Perhaps you modified the iterated array within the loop? @@ -5058,8 +5102,8 @@ executed, so its $a is not available for capture. =item Variable "%s" is not imported%s -(F) While "use strict" in effect, you referred to a global variable that -you apparently thought was imported from another module, because +(W misc) With "use strict" in effect, you referred to a global variable +that you apparently thought was imported from another module, because something else of the same name (usually a subroutine) is exported by that module. It usually means you put the wrong funny character on the front of your variable.