X-Git-Url: https://perl5.git.perl.org/perl5.git/blobdiff_plain/2a9203e94b669f45c3d0b2161702767b6a8ac237..fafdadbd9bc5a1631942dcbd40913421d206117e:/pod/perldiag.pod diff --git a/pod/perldiag.pod b/pod/perldiag.pod index f9a56fa..02f9237 100644 --- a/pod/perldiag.pod +++ b/pod/perldiag.pod @@ -189,6 +189,11 @@ alternatives. that expected a numeric value instead. If you're fortunate the message will identify which operator was so unfortunate. +Note that for the C and C (infinity and not-a-number) the +definition of "numeric" is somewhat unusual: the strings themselves +(like "Inf") are considered numeric, and anything following them is +considered non-numeric. + =item Argument list not closed for PerlIO layer "%s" (W layer) When pushing a layer with arguments onto the Perl I/O @@ -469,6 +474,11 @@ that wasn't a symbol table entry. (P) An internal request asked to add a hash entry to something that wasn't a symbol table entry. +=item Bad symbol for scalar + +(P) An internal request asked to add a scalar entry to something that +wasn't a symbol table entry. + =item Bareword found in conditional (W bareword) The compiler found a bareword where it expected a @@ -549,6 +559,22 @@ copiable. (P) When starting a new thread or returning values from a thread, Perl encountered an invalid data type. +=item Both or neither range ends should be Unicode in regex; marked by +S<<-- HERE> in m/%s/ + +(W regexp) (only under C> or within C<(?[...])>) + +In a bracketed character class in a regular expression pattern, you +had a range which has exactly one end of it specified using C<\N{}>, and +the other end is specified using a non-portable mechanism. Perl treats +the range as a Unicode range, that is, all the characters in it are +considered to be the Unicode characters, and which may be different code +points on some platforms Perl runs on. For example, C<[\N{U+06}-\x08]> +is treated as if you had instead said C<[\N{U+06}-\N{U+08}]>, that is it +matches the characters whose code points in Unicode are 6, 7, and 8. +But that C<\x08> might indicate that you meant something different, so +the warning gets raised. + =item Buffer overflow in prime_env_iter: %s (W internal) A warning peculiar to VMS. While Perl was preparing to @@ -636,6 +662,14 @@ keep a reference count on its arguments and cannot be made to do so. Such arrays are not even supposed to be accessible to Perl code, but are only used internally. +=item Cannot yet reorder sv_catpvfn() arguments from va_list + +(F) Some XS code tried to use C or a related function with a +format string that specifies explicit indexes for some of the elements, and +using a C-style variable-argument list (a C). This is not currently +supported. XS authors wanting to do this must instead construct a C array of +C scalars containing the arguments. + =item Can only compress unsigned integers in pack (F) An argument to pack("w",...) was not an integer. The BER compressed @@ -834,13 +868,6 @@ found in the PATH did not have correct permissions. (F) A string of a form C was given to prototype(), but there is no builtin with the name C. -=item Can't find %s character property "%s" - -(F) You used C<\p{}> or C<\P{}> but the character property by that name -could not be found. Maybe you misspelled the name of the property? -See L -for a complete list of available official properties. - =item Can't find label %s (F) You said to goto a label that isn't mentioned anywhere that it's @@ -873,13 +900,19 @@ L for the full details on here-documents. =item Can't find Unicode property definition "%s" -(F) You may have tried to use C<\p> which means a Unicode -property (for example C<\p{Lu}> matches all uppercase -letters). If you did mean to use a Unicode property, see +=item Can't find Unicode property definition "%s" in regex; marked by <-- HERE in m/%s/ + +(F) The named property which you specified via C<\p> or C<\P> is not one +known to Perl. Perhaps you misspelled the name? See L -for a complete list of available properties. If you didn't -mean to use a Unicode property, escape the C<\p>, either by -C<\\p> (just the C<\p>) or by C<\Q\p> (the rest of the string, or +for a complete list of available official +properties. If it is a +L +it must have been defined by the time the regular expression is +matched. + +If you didn't mean to use a Unicode property, escape the C<\p>, either +by C<\\p> (just the C<\p>) or by C<\Q\p> (the rest of the string, or until C<\E>). =item Can't fork: %s @@ -1074,7 +1107,7 @@ to change it, such as with an auto-increment. (P) The internal routine that does assignment to a substr() was handed a NULL. -=item Can't modify non-lvalue subroutine call +=item Can't modify non-lvalue subroutine call of &%s (F) Subroutines meant to be used in lvalue context should be declared as such. See L. @@ -1183,6 +1216,11 @@ missing. You need to figure out where your CRTL misplaced its environ or define F (see L) so that environ is not searched. +=item Can't redeclare "%s" in "%s" + +(F) A "my", "our" or "state" declaration was found within another declaration, +such as C or C. + =item Can't "redo" outside a loop block (F) A "redo" statement was executed to restart the current block, but @@ -1439,6 +1477,13 @@ Note that ASCII characters that don't map to control characters are discouraged, and will generate the warning (when enabled) L. +=item Character following \%c must be '{' or a single-character Unicode property name in regex; marked by <-- HERE in m/%s/ + +(F) (In the above the C<%c> is replaced by either C

or C

.) You +specified something that isn't a legal Unicode property name. Most +Unicode properties are specified by C<\p{...}>. But if the name is a +single character one, the braces may be omitted. + =item Character in 'C' format wrapped in pack (W pack) You said @@ -1533,15 +1578,18 @@ defined in the C<:alias> import argument to C, but they could be defined by a translator installed into C<$^H{charnames}>. See L. -=item \C is deprecated in regex; marked by <-- HERE in m/%s/ +=item chdir() on unopened filehandle %s + +(W unopened) You tried chdir() on a filehandle that was never opened. -(D deprecated, regexp) The \C character class is deprecated, and will -become a compile-time error in a future release of perl (tentatively -v5.24). This construct allows you to match a single byte of what makes -up a multi-byte single UTF8 character, and breaks encapsulation. It is -currently also very buggy. If you really need to process the individual -bytes, you probably want to convert your string to one where each -underlying byte is stored as a character, with utf8::encode(). +=item \C no longer supported in regex; marked by S<<-- HERE> in m/%s/ + +(F) The \C character class used to allow a match of single byte within a +multi-byte utf-8 character, but was removed in v5.24 as it broke +encapsulation and its implementation was extremely buggy. If you really +need to process the individual bytes, you probably want to convert your +string to one where each underlying byte is stored as a character, with +utf8::encode(). =item "\c%c" is more clearly written simply as "%s" @@ -1575,17 +1623,41 @@ This subroutine cannot be called. (F) You had a (sub-)template that ends with a '/'. There must be another template code following the slash. See L. +=item Code point 0x%X is not Unicode, and not portable + +(S non_unicode) You had a code point that has never been in any +standard, so it is likely that languages other than Perl will NOT +understand it. At one time, it was legal in some standards to have code +points up to 0x7FFF_FFFF, but not higher, and this code point is higher. + +Acceptance of these code points is a Perl extension, and you should +expect that nothing other than Perl can handle them; Perl itself on +EBCDIC platforms before v5.24 does not handle them. + +Code points above 0xFFFF_FFFF require larger than a 32 bit word. + +Perl also makes no guarantees that the representation of these code +points won't change at some point in the future, say when machines +become available that have larger than a 64-bit word. At that time, +files written by an older Perl would require conversion before being +readable by a newer Perl. + =item Code point 0x%X is not Unicode, may not be portable (S non_unicode) You had a code point above the Unicode maximum of U+10FFFF. -Perl allows strings to contain a superset of Unicode code points, up -to the limit of what is storable in an unsigned integer on your system, -but these may not be accepted by other languages/systems. At one time, -it was legal in some standards to have code points up to 0x7FFF_FFFF, -but not higher. Code points above 0xFFFF_FFFF require larger than a -32 bit word. +Perl allows strings to contain a superset of Unicode code points, but +these may not be accepted by other languages/systems. Further, even if +these languages/systems accept these large code points, they may have +chosen a different representation for them than the UTF-8-like one that +Perl has, which would mean files are not exchangeable between them and +Perl. + +On EBCDIC platforms, code points above 0x3FFF_FFFF have a different +representation in Perl v5.24 than before, so any file containing these +that was written before that version will require conversion before +being readable by a later Perl. =item %s: Command not found @@ -1692,7 +1764,20 @@ workarounds. (F) The parser found inconsistencies either while attempting to define an overloaded constant, or when trying to find the character name specified in the C<\N{...}> escape. Perhaps you -forgot to load the corresponding L pragma?. +forgot to load the corresponding L pragma? + +=item :const is experimental + +(S experimental::const_attr) The "const" attribute is experimental. +If you want to use the feature, disable the warning with C, but know that in doing so you are taking +the risk that your code may break in a future Perl version. + +=item :const is not permitted on named subroutines + +(F) The "const" attribute causes an anonymous subroutine to be run and +its value captured at the time that it is cloned. Named subroutines are +not cloned like this, so the attribute does not make sense on them. =item Copy method did not return a reference @@ -1762,7 +1847,7 @@ S<<-- HERE> in m/%s/ most likely cause of this error is that you left out a parenthesis inside of the C<....> part. -The <-- HERE shows whereabouts in the regular expression the problem was +The S<<-- HERE> shows whereabouts in the regular expression the problem was discovered. =item %s defines neither package nor VERSION--version check failed @@ -1917,14 +2002,6 @@ already been freed. (W unpack) You have applied the same modifier more than once after a type in a pack template. See L. -=item each on reference is experimental - -(S experimental::autoderef) C with a scalar argument is experimental -and may change or be removed in a future Perl version. If you want to -take the risk of using this feature, simply disable this warning: - - no warnings "experimental::autoderef"; - =item elseif should be elsif (S syntax) There is no keyword "elseif" in Perl because Larry thinks @@ -1985,7 +2062,7 @@ S<<-- HERE> in m/%s/ (F) You used a pattern that nested too many EVAL calls without consuming any text. Restructure the pattern so that text is consumed. -The <-- HERE shows whereabouts in the regular expression the problem was +The S<<-- HERE> shows whereabouts in the regular expression the problem was discovered. =item Excessively long <> operator @@ -2081,6 +2158,13 @@ L. use feature "signatures"; sub foo ($left, $right) { ... } +=item Experimental %s on scalar is now forbidden + +(F) An experimental feature added in Perl 5.14 allowed C, C, +C, C, C, C, C, and C to be called +with a scalar argument. This experiment is considered unsuccessful, and has +been removed. The C feature may meet your needs better. + =item Experimental "%s" subs not enabled (F) To use lexical subs, you must first enable them: @@ -2353,7 +2437,7 @@ than the floating point supports. (W overflow) The hexadecimal floating point has a smaller exponent than the floating point supports. -=item Hexadecimal float: internal error +=item Hexadecimal float: internal error (%s) (F) Something went horribly bad in hexadecimal float handling. @@ -2489,6 +2573,15 @@ L)>|perlre/(?PARNO) (?-PARNO) (?+PARNO) (?R) (?0)>. (X) The PERL5OPT environment variable may only be used to set the following switches: B<-[CDIMUdmtw]>. +=item Illegal user-defined property name + +(F) You specified a Unicode-like property name in a regular expression +pattern (using C<\p{}> or C<\P{}>) that Perl knows isn't an official +Unicode property, and was likely meant to be a user-defined property +name, but it can't be one of those, as they must begin with either C +or C. Check the spelling. See also +L. + =item Ill-formed CRTL environ value "%s" (W internal) A warning peculiar to VMS. Perl tried to read the CRTL's @@ -2528,12 +2621,6 @@ parent '%s' C3-consistent, and you have enabled the C3 MRO for this class. See the C3 documentation in L for more information. -=item In EBCDIC the v-string components cannot exceed 2147483647 - -(F) An error peculiar to EBCDIC. Internally, v-strings are stored as -Unicode code points, and encoded in EBCDIC as UTF-EBCDIC. The UTF-EBCDIC -encoding is limited to code points no larger than 2147483647 (0x7FFFFFFF). - =item Infinite recursion in regex (F) You used a pattern that references itself without consuming any input @@ -2570,6 +2657,32 @@ provides a list context to its subscript, which can do weird things if you're expecting only one subscript. When called in list context, it also returns the key in addition to the value. +=item Invalid number '%s' for -C option. + +(F) You supplied a number to the -C option that either has extra leading +zeroes or overflows perl's unsigned integer representation. + +=item %s() is deprecated on :utf8 handles + +(W deprecated) The sysread(), recv(), syswrite() and send() operators +are deprecated on handles that have the C<:utf8> layer, either +explicitly, or implicitly, eg., with the C<:encoding(UTF-16LE)> layer. + +Both sysread() and recv() currently use only the C<:utf8> flag for the +stream, ignoring the actual layers. Since sysread() and recv() do no +UTF-8 validation they can end up creating invalidly encoded scalars. + +Similarly, syswrite() and send() use only the C<:utf8> flag, otherwise +ignoring any layers. If the flag is set, both write the value UTF-8 +encoded, even if the layer is some different encoding, such as the +example above. + +Ideally, all of these operators would completely ignore the C<:utf8> +state, working only with bytes, but this would result in silently +breaking existing code. To avoid this a future version of perl will +throw an exception when any of sysread(), recv(), syswrite() or send() +are called on handle with the C<:utf8> layer. + =item Insecure dependency in %s (F) You tried to do something that the tainting mechanism didn't like. @@ -2728,13 +2841,6 @@ instead, except within S>, where it is a fatal error. The S<<-- HERE> shows whereabouts in the regular expression the escape was discovered. -=item %s: Invalid handshake key got %p needed %p, binaries are mismatched - -(P) A dynamic loading library C<.so> or C<.dll> was being loaded into the -process that was built against a different build of perl than the -said library was compiled against. Reinstalling the XS module will -likely fix this error. - =item Invalid hexadecimal number in \N{U+...} =item Invalid hexadecimal number in \N{U+...} in regex; marked by @@ -2770,6 +2876,13 @@ character (U+FFFD). with the B<-D> option with no flags to see the list of acceptable values. See also L. +=item Invalid quantifier in {,} in regex; marked by S<<-- HERE> in m/%s/ + +(F) The pattern looks like a {min,max} quantifier, but the min or max +could not be parsed as a valid number - either it has leading zeroes, +or it represents too big a number to cope with. The S<<-- HERE> shows +where in the regular expression the problem was discovered. See L. + =item Invalid [] range "%s" in regex; marked by S<<-- HERE> in m/%s/ (F) The range specified in a character class had a minimum character @@ -2862,6 +2975,20 @@ with 'useperlio'. (F) Your machine doesn't implement the sockatmark() functionality, neither as a system call nor an ioctl call (SIOCATMARK). +=item '%s' is an unknown bound type in regex; marked by S<<-- HERE> in m/%s/ + +(F) You used C<\b{...}> or C<\B{...}> and the C<...> is not known to +Perl. The current valid ones are given in +L. + +=item "%s" is more clearly written simply as "%s" in regex; marked by S<<-- HERE> in m/%s/ + +(W regexp) (only under C> or within C<(?[...])>) + +You specified a character that has the given plainer way of writing it, +and which is also portable to platforms running with different character +sets. + =item $* is no longer supported (D deprecated, syntax) The special variable C<$*>, deprecated in older @@ -2891,6 +3018,20 @@ an anonymous subroutine, or a reference to a subroutine. (W overload) You tried to overload a constant type the overload package is unaware of. +=item It is deprecated to use code point 0x%s; the permissible max is 0x%s + +(D deprecated) You used a code point that will not be allowed in a +future perl version, because it is too large. Unicode only allows code +points up to 0x10FFFF, but Perl allows much larger ones. However, the +largest possible ones break the perl interpreter in some constructs, +including causing it to hang in a few cases. The known problem areas +are in C, regular expression pattern matching using quantifiers, +and as the upper limits in loops. + +If your code is to run on various platforms, keep in mind that the upper +limit depends on the platform. It is much larger on 64-bit word sizes +than 32-bit ones. + =item -i used with no filenames on the command line, reading from STDIN (S inplace) The C<-i> option was passed on the command line, indicating @@ -2905,14 +3046,6 @@ line. See L for more details. (P) The regular expression parser is confused. -=item keys on reference is experimental - -(S experimental::autoderef) C with a scalar argument is experimental -and may change or be removed in a future Perl version. If you want to -take the risk of using this feature, simply disable this warning: - - no warnings "experimental::autoderef"; - =item Label not found for "last %s" (F) You named a loop to break out of, but you're not currently in a loop @@ -2980,18 +3113,25 @@ L. form of C does not support pipes, such as C. Use the two-argument C form instead. +=item %s: loadable library and perl binaries are mismatched (got handshake key %p, needed %p) + +(P) A dynamic loading library C<.so> or C<.dll> was being loaded into the +process that was built against a different build of perl than the +said library was compiled against. Reinstalling the XS module will +likely fix this error. + =item Locale '%s' may not work well.%s -(W locale) The named locale that Perl is now trying to use is not fully -compatible with Perl. The second C<%s> gives a reason. +(W locale) You are using the named locale, which is a non-UTF-8 one, and +which perl has determined is not fully compatible with what it can +handle. The second C<%s> gives a reason. By far the most common reason is that the locale has characters in it that are represented by more than one byte. The only such locales that Perl can handle are the UTF-8 locales. Most likely the specified locale is a non-UTF-8 one for an East Asian language such as Chinese or Japanese. If the locale is a superset of ASCII, the ASCII portion of it -may work in Perl. Read on for problems when it isn't a superset of -ASCII. +may work in Perl. Some essentially obsolete locales that aren't supersets of ASCII, mainly those in ISO 646 or other 7-bit locales, such as ASMO 449, can also have @@ -2999,6 +3139,18 @@ problems, depending on what portions of the ASCII character set get changed by the locale and are also used by the program. The warning message lists the determinable conflicting characters. +Note that not all incompatibilities are found. + +If this happens to you, there's not much you can do except switch to use a +different locale or use L to translate from the locale into +UTF-8; if that's impracticable, you have been warned that some things +may break. + +This message is output once each time a bad locale is switched into +within the scope of C>, or on the first possibly-affected +operation if the C> inherits a bad one. It is not raised +for any operations from the L module. + =item localtime(%f) failed (W overflow) You called C with a number that it could not handle: @@ -3307,6 +3459,8 @@ file-specification as an argument. See L. (F) Missing right brace in C<\x{...}>, C<\p{...}>, C<\P{...}>, or C<\N{...}>. +=item Missing right brace on \N{} + =item Missing right brace on \N{} or unescaped left brace after \N (F) C<\N> has two meanings. @@ -3430,6 +3584,13 @@ They're written like C<$foo[1][2][3]>, as in C. follow some unpack specification producing a numeric value. See L. +=item %s must not be a named sequence in transliteration operator + +(F) Transliteration (C and C) transliterates individual +characters. But a named sequence by definition is more than an +individual charater, and hence doing this operation on it doesn't make +sense. + =item "my sub" not yet implemented (F) Lexically scoped subroutines are not yet implemented. Don't try @@ -3538,8 +3699,7 @@ 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{} in inverted character class or as a range end-point is restricted to one character in regex; marked -by S<<-- HERE> in m/%s/ +=item \N{} in inverted character class or as a range end-point is restricted to one character in regex; marked by <-- HERE in m/%s/ (F) Named Unicode character escapes (C<\N{...}>) may return a multi-character sequence. Even though a character class is @@ -3685,6 +3845,12 @@ in the remaining packages of the MRO of this class. If you don't want it throwing an exception, use C or C. See L. +=item Non-finite repeat count does nothing + +(W numeric) You tried to execute the +L|perlop/Multiplicative Operators> repetition operator C (or +C<-Inf>) or C times, which doesn't make sense. + =item Non-hex character in regex; marked by S<<-- HERE> in m/%s/ (F) In a regular expression, there was a non-hexadecimal character where @@ -3733,7 +3899,7 @@ find the name of the file to which to write data destined for stdout. (F) Fully qualified variable names are not allowed in "our" declarations, because that doesn't make much sense under existing -semantics. Such syntax is reserved for future extensions. +rules. Such syntax is reserved for future extensions. =item No Perl script found in input @@ -3988,7 +4154,7 @@ the C overloading key is specified to be true. See L. =item Operation "%s" returns its argument for non-Unicode code point 0x%X -(S non_unicode) You performed an operation requiring Unicode semantics +(S non_unicode) You performed an operation requiring Unicode rules on a code point that is not in Unicode, so what it should do is not defined. Perl has chosen to have it do nothing, and warn you. @@ -4001,9 +4167,9 @@ C. =item Operation "%s" returns its argument for UTF-16 surrogate U+%X (S surrogate) You performed an operation requiring Unicode -semantics on a Unicode surrogate. Unicode frowns upon the use +rules on a Unicode surrogate. Unicode frowns upon the use of surrogates for anything but storing strings in UTF-16, but -semantics are (reluctantly) defined for the surrogates, and +rules are (reluctantly) defined for the surrogates, and they are to do nothing for this operation. Because the use of surrogates can be dangerous, Perl warns. @@ -4512,15 +4678,7 @@ fine from VMS' perspective, it's probably not what you intended. (F) The unpack format P must have an explicit size, not "*". -=item pop on reference is experimental - -(S experimental::autoderef) C with a scalar argument is experimental -and may change or be removed in a future Perl version. If you want to -take the risk of using this feature, simply disable this warning: - - no warnings "experimental::autoderef"; - -=item POSIX class [:%s:] unknown in regex; marked by S<< <-- HERE in m/%s/ >> +=item POSIX class [:%s:] unknown in regex; marked by S<<-- HERE> in m/%s/ (F) The class in the character class [: :] syntax is unknown. The S<<-- HERE> shows whereabouts in the regular expression the problem was discovered. @@ -4637,7 +4795,7 @@ Note this may be also triggered for constructs like: sub { 1 if die; } -=item Possible precedence problem on bitwise %c operator +=item Possible precedence problem on bitwise %s operator (W precedence) Your program uses a bitwise logical operator in conjunction with a numeric comparison operator, like this : @@ -4670,21 +4828,6 @@ but there was no array C<@foo> in scope at the time. If you wanted a literal @foo, then write it as \@foo; otherwise find out what happened to the array you apparently lost track of. -=item Postfix dereference is experimental - -(S experimental::postderef) This warning is emitted if you use -the experimental postfix dereference syntax. Simply suppress the -warning if you want to use the feature, but know that in doing -so you are taking the risk of using an experimental feature which -may change or be removed in a future Perl version: - - no warnings "experimental::postderef"; - use feature "postderef", "postderef_qq"; - $ref->$*; - $aref->@*; - $aref->@[@indices]; - ... etc ... - =item Precedence problem: open %s should be open(%s) (S precedence) The old irregular construct @@ -4722,16 +4865,6 @@ port. One can easily disable this by appropriate sighandlers, see L. See also "Process terminated by SIGTERM/SIGINT" in L. -=item Property '%s' is unknown in regex; marked by S<<-- HERE> in m/%s/ - -(F) The named property which you specified via C<\p> or C<\P> is not one -known to Perl. Perhaps you misspelled the name? See -L -for a complete list of available official -properties. If it is a L -it must have been defined by the time the regular expression is -compiled. - =item Prototype after '%c' for %s : %s (W illegalproto) A character follows % or @ in a prototype. This is @@ -4754,22 +4887,13 @@ the sub name and via the prototype attribute. The prototype in parentheses is useless, since it will be replaced by the prototype from the attribute before it's ever used. -=item push on reference is experimental - -(S experimental::autoderef) C with a scalar argument is experimental -and may change or be removed in a future Perl version. If you want to -take the risk of using this feature, simply disable this warning: - - no warnings "experimental::autoderef"; - -=item Quantifier follows nothing in regex; marked by S<< <-- HERE in m/%s/ >> +=item Quantifier follows nothing in regex; marked by S<<-- HERE> in m/%s/ (F) You started a regular expression with a quantifier. Backslash it if you meant it literally. The S<<-- HERE> shows whereabouts in the regular expression the problem was discovered. See L. -=item Quantifier in {,} bigger than %d in regex; marked by S<<-- HERE> in -m/%s/ +=item Quantifier in {,} bigger than %d in regex; marked by S<<-- HERE> in m/%s/ (F) There is currently a limit to the size of the min and max values of the {min,max} construct. The S<<-- HERE> shows whereabouts in the regular @@ -4798,6 +4922,45 @@ are outside the range which can be represented by integers internally. One possible workaround is to force Perl to use magical string increment by prepending "0" to your numbers. +=item Ranges of ASCII printables should be some subset of "0-9", "A-Z", or +"a-z" in regex; marked by S<<-- HERE> in m/%s/ + +(W regexp) (only under C> or within C<(?[...])>) + +Stricter rules help to find typos and other errors. Perhaps you didn't +even intend a range here, if the C<"-"> was meant to be some other +character, or should have been escaped (like C<"\-">). If you did +intend a range, the one that was used is not portable between ASCII and +EBCDIC platforms, and doesn't have an obvious meaning to a casual +reader. + + [3-7] # OK; Obvious and portable + [d-g] # OK; Obvious and portable + [A-Y] # OK; Obvious and portable + [A-z] # WRONG; Not portable; not clear what is meant + [a-Z] # WRONG; Not portable; not clear what is meant + [%-.] # WRONG; Not portable; not clear what is meant + [\x41-Z] # WRONG; Not portable; not obvious to non-geek + +(You can force portability by specifying a Unicode range, which means that +the endpoints are specified by +L|perlrecharclass/Character Ranges>, but the meaning may +still not be obvious.) +The stricter rules require that ranges that start or stop with an ASCII +character that is not a control have all their endpoints be the literal +character, and not some escape sequence (like C<"\x41">), and the ranges +must be all digits, or all uppercase letters, or all lowercase letters. + +=item Ranges of digits should be from the same group in regex; marked by +S<<-- HERE> in m/%s/ + +(W regexp) (only under C> or within C<(?[...])>) + +Stricter rules help to find typos and other errors. You included a +range, and at least one of the end points is a decimal digit. Under the +stricter rules, when this happens, both end points should be digits in +the same group of 10 consecutive digits. + =item readdir() attempted on invalid dirhandle %s (W io) The dirhandle you're reading from is either closed or not really @@ -4892,7 +5055,7 @@ not at least seven sets of capturing parentheses in the expression. If you wanted to have the character with ordinal 7 inserted into the regular expression, prepend zeroes to make it three digits long: C<\007> -The <-- HERE shows whereabouts in the regular expression the problem was +The S<<-- HERE> shows whereabouts in the regular expression the problem was discovered. =item Reference to nonexistent named group in regex; marked by S<<-- HERE> @@ -4903,7 +5066,7 @@ expression, but there is no corresponding named capturing parentheses such as C<(?'NAME'...)> or C<< (?...) >>. Check if the name has been spelled correctly both in the backreference and the declaration. -The <-- HERE shows whereabouts in the regular expression the problem was +The S<<-- HERE> shows whereabouts in the regular expression the problem was discovered. =item Reference to nonexistent or unclosed group in regex; marked by @@ -4913,7 +5076,7 @@ S<<-- HERE> in m/%s/ are not at least seven sets of closed capturing parentheses in the expression before where the C<\g{-7}> was located. -The <-- HERE shows whereabouts in the regular expression the problem was +The S<<-- HERE> shows whereabouts in the regular expression the problem was discovered. =item regexp memory corruption @@ -5136,6 +5299,13 @@ missing the final closing quote or angle bracket after the name. The S<<-- HERE> shows whereabouts in the regular expression the problem was discovered. +=item Sequence (?... not terminated in regex; marked by S<<-- HERE> in +m/%s/ + +(F) There was no matching closing parenthesis for the '('. The +S<<-- HERE> shows whereabouts in the regular expression the problem was +discovered. + =item Sequence \%s... not terminated in regex; marked by S<<-- HERE> in m/%s/ @@ -5221,7 +5391,7 @@ L. =item Setting ${^ENCODING} is deprecated -(D deprecated) You assiged a non-C value to C<${^ENCODING}>. +(D deprecated) You assigned a non-C value to C<${^ENCODING}>. This is deprecated; see C> for details. =item Setting $/ to a reference to %s as a form of slurp is deprecated, treating as undef @@ -5248,14 +5418,6 @@ a positive integer, where the integer was the address of the reference. As of Perl 5.20.0 this is a fatal error, to allow future versions of Perl to use non-integer refs for more interesting purposes. -=item shift on reference is experimental - -(S experimental::autoderef) C with a scalar argument is experimental -and may change or be removed in a future Perl version. If you want to -take the risk of using this feature, simply disable this warning: - - no warnings "experimental::autoderef"; - =item shm%s not implemented (F) You don't have System V shared memory IPC on your system. @@ -5321,11 +5483,6 @@ overhauled. (F) An ancient error message that almost nobody ever runs into anymore. But before sort was a keyword, people sometimes used it as a filehandle. -=item Sort subroutine didn't return single value - -(F) A sort comparison subroutine written in XS must return exactly one -item. See L. - =item Source filters apply only to byte streams (F) You tried to activate a source filter (usually by loading a @@ -5341,15 +5498,6 @@ end of the array, rather than past it. If this isn't what you want, try explicitly pre-extending the array by assigning $#array = $offset. See L. -=item splice on reference is experimental - -(S experimental::autoderef) C with a scalar argument -is experimental and may change or be removed in a future -Perl version. If you want to take the risk of using this -feature, simply disable this warning: - - no warnings "experimental::autoderef"; - =item Split loop (P) The split was looping infinitely. (Obviously, a split shouldn't @@ -5438,6 +5586,15 @@ the previous instance. This is almost always a typographical error. Note that the earlier subroutine will still exist until the end of the scope or until all closure references to it are destroyed. +=item Subroutine %s redefined + +(W redefine) You redefined a subroutine. To suppress this warning, say + + { + no warnings 'redefine'; + eval "sub name { ... }"; + } + =item Subroutine "%s" will not stay shared (W closure) An inner (nested) I subroutine is referencing a "my" @@ -5457,15 +5614,6 @@ anonymous, using the C syntax. When inner anonymous subs that reference lexical subroutines in outer subroutines are created, they are automatically rebound to the current values of such lexical subs. -=item Subroutine %s redefined - -(W redefine) You redefined a subroutine. To suppress this warning, say - - { - no warnings 'redefine'; - eval "sub name { ... }"; - } - =item Substitution loop (P) The substitution was looping infinitely. (Obviously, a substitution @@ -5532,7 +5680,7 @@ is not known. The condition must be one of the following: (R&NAME) true if directly inside named capture (DEFINE) always false; for defining named subpatterns -The <-- HERE shows whereabouts in the regular expression the problem was +The S<<-- HERE> shows whereabouts in the regular expression the problem was discovered. See L. =item Switch (?(condition)... not terminated in regex; marked by @@ -5644,6 +5792,18 @@ as a compiler directive. You may say only one of This is to prevent the problem of one module changing the array base out from under another module inadvertently. See L and L. +=item The bitwise feature is experimental + +(S experimental::bitwise) This warning is emitted if you use bitwise +operators (C<& | ^ ~ &. |. ^. ~.>) with the "bitwise" feature enabled. +Simply suppress the warning if you want to use the feature, but know +that in doing so you are taking the risk of using an experimental +feature which may change or be removed in a future Perl version: + + no warnings "experimental::bitwise"; + use feature "bitwise"; + $x |.= $y; + =item The crypt() function is unimplemented due to excessive paranoia. (F) Configure couldn't find the crypt() function on your machine, @@ -5855,11 +6015,6 @@ certain type. Arrays must be @NAME or C<@{EXPR}>. Hashes must be %NAME or C<%{EXPR}>. No implicit dereferencing is allowed--use the {EXPR} forms as an explicit dereference. See L. -=item Type of argument to %s must be unblessed hashref or arrayref - -(F) You called C, C or C with a scalar argument that -was not a reference to an unblessed hash or array. - =item umask not implemented (F) Your machine doesn't implement the umask function and you tried to @@ -5933,7 +6088,7 @@ C. Check the #! line, or manually feed your script into Perl yourself. =item Unescaped left brace in regex is deprecated, passed through in regex; -marked by <-- HERE in m/%s/ +marked by S<<-- HERE> in m/%s/ (D deprecated, regexp) You used a literal C<"{"> character in a regular expression pattern. You should change to use C<"\{"> instead, because a @@ -6009,7 +6164,7 @@ There should be an operator before the C<"(">, as there's no indication as to how the digits are to be combined with the characters in the Lao and Thai scripts. -=item Unicode non-character U+%X is illegal for open interchange +=item Unicode non-character U+%X is not recommended for open interchange (S nonchar) Certain codepoints, such as U+FFFE and U+FFFF, are defined by the Unicode standard to be non-characters. Those @@ -6106,7 +6261,7 @@ is not known. The condition must be one of the following: (R&NAME) true if directly inside named capture (DEFINE) always false; for defining named subpatterns -The <-- HERE shows whereabouts in the regular expression the problem was +The S<<-- HERE> shows whereabouts in the regular expression the problem was discovered. See L. =item Unknown Unicode option letter '%c' @@ -6235,15 +6390,6 @@ on your system. think you didn't do that, check the #! line to see if it's supplying the bad switch on your behalf.) -=item unshift on reference is experimental - -(S experimental::autoderef) C with a scalar argument -is experimental and may change or be removed in a future -Perl version. If you want to take the risk of using this -feature, simply disable this warning: - - no warnings "experimental::autoderef"; - =item Unsuccessful %s on filename containing newline (W newline) A file operation was attempted on a filename, and that @@ -6385,7 +6531,7 @@ must be written as if ($string =~ /$pattern/) { ... } -The <-- HERE shows whereabouts in the regular expression the problem was +The S<<-- HERE> shows whereabouts in the regular expression the problem was discovered. See L. =item Useless localization of %s @@ -6406,9 +6552,16 @@ must be written as if ($string =~ /$pattern/o) { ... } -The <-- HERE shows whereabouts in the regular expression the problem was +The S<<-- HERE> shows whereabouts in the regular expression the problem was discovered. See L. +=item Useless use of attribute "const" + +(W misc) The C attribute has no effect except +on anonymous closure prototypes. You applied it to +a subroutine via L. This is only useful +inside an attribute handler for an anonymous subroutine. + =item Useless use of /d modifier in transliteration operator (W misc) You have used the /d modifier where the searchlist has the @@ -6513,16 +6666,6 @@ is deprecated. See L. form if you wish to use an empty line as the terminator of the here-document. -=item Use of chdir('') or chdir(undef) as chdir() deprecated - -(D deprecated) chdir() with no arguments is documented to change to -$ENV{HOME} or $ENV{LOGDIR}. chdir(undef) and chdir('') share this -behavior, but that has been deprecated. In future versions they -will simply fail. - -Be careful to check that what you pass to chdir() is defined and not -blank, else you might find yourself in your home directory. - =item Use of /c modifier is meaningless in s/// (W regexp) You used the /c modifier in a substitution. The /c @@ -6555,6 +6698,14 @@ error, so C<:=> can be reclaimed as a new operator in the future. If you need an empty attribute list, for example in a code generator, add a space before the C<=>. +=item Use of %s for non-UTF-8 locale is wrong. Assuming a UTF-8 locale + +(W locale) You are matching a regular expression using locale rules, +and the specified construct was encountered. This construct is only +valid for UTF-8 locales, which the current locale isn't. This doesn't +make sense. Perl will continue, assuming a Unicode (UTF-8) locale, but +the results are likely to be wrong. + =item Use of freed value in iteration (F) Perhaps you modified the iterated array within the loop? @@ -6640,12 +6791,6 @@ for historical reasons. it already went past any symlink you are presumably trying to look for. The operation returned C. Use a filename instead. -=item Use of my $_ is experimental - -(S experimental::lexical_topic) Lexical $_ is an experimental feature and -its behavior may change or even be removed in any future release of perl. -See the explanation under L. - =item Use of %s on a handle without * is deprecated (D deprecated) You used C, C or C on a scalar but that scalar @@ -6697,6 +6842,14 @@ optimized into C<"that " . $foo>, and the warning will refer to the C operator, even though there is no C<.> in your program. +=item "use re 'strict'" is experimental + +(S experimental::re_strict) The things that are different when a regular +expression pattern is compiled under C<'strict'> are subject to change +in future Perl releases in incompatible ways. This means that a pattern +that compiles today may not in a future Perl release. This warning is +to alert you to that risk. + =item Use \x{...} for more than two hex characters in regex; marked by S<<-- HERE> in m/%s/ @@ -6726,6 +6879,15 @@ a range. For these, what should happen isn't clear at all. In these circumstances, Perl discards all but the first character of the returned sequence, which is not likely what you want. +=item Using /u for '%s' instead of /%s in regex; marked by S<<-- HERE> in m/%s/ + +(W regexp) You used a Unicode boundary (C<\b{...}> or C<\B{...}>) in a +portion of a regular expression where the character set modifiers C +or C are in effect. These two modifiers indicate an ASCII +interpretation, and this doesn't make sense for a Unicode defintion. +The generated regular expression will compile so that the boundary uses +all of Unicode. No other portion of the regular expression is affected. + =item Using !~ with %s doesn't make sense (F) Using the C operator with C, C or C is @@ -6760,15 +6922,6 @@ C operator. longer than 1024 characters. The return value has been truncated to 1024 characters. -=item values on reference is experimental - -(S experimental::autoderef) C with a scalar argument -is experimental and may change or be removed in a future -Perl version. If you want to take the risk of using this -feature, simply disable this warning: - - no warnings "experimental::autoderef"; - =item Variable "%s" is not available (W closure) During compilation, an inner named subroutine or eval is @@ -6939,6 +7092,25 @@ warning is to add C but that is often closer to cheating. In general, you are supposed to explicitly mark the filehandle with an encoding, see L and L. +=item Wide character (U+%X) in %s + +(W locale) While in a single-byte locale (I, a non-UTF-8 +one), a multi-byte character was encountered. Perl considers this +character to be the specified Unicode code point. Combining non-UTF-8 +locales and Unicode is dangerous. Almost certainly some characters +will have two different representations. For example, in the ISO 8859-7 +(Greek) locale, the code point 0xC3 represents a Capital Gamma. But so +also does 0x393. This will make string comparisons unreliable. + +You likely need to figure out how this multi-byte character got mixed up +with your single-byte locale (or perhaps you thought you had a UTF-8 +locale, but Perl disagrees). + +=item %s() with negative argument + +(S misc) Certain operations make no sense with negative arguments. +Warning is given and the operation is not done. + =item Within []-length '%c' not allowed (F) The count in the (un)pack template may be replaced by C<[TEMPLATE]>