Spaces:
Running
Running
| =encoding utf8 | |
| =head1 NAME | |
| perl5220delta - what is new for perl v5.22.0 | |
| =head1 DESCRIPTION | |
| This document describes differences between the 5.20.0 release and the 5.22.0 | |
| release. | |
| If you are upgrading from an earlier release such as 5.18.0, first read | |
| L<perl5200delta>, which describes differences between 5.18.0 and 5.20.0. | |
| =head1 Core Enhancements | |
| =head2 New bitwise operators | |
| A new experimental facility has been added that makes the four standard | |
| bitwise operators (C<& | ^ ~>) treat their operands consistently as | |
| numbers, and introduces four new dotted operators (C<&. |. ^. ~.>) that | |
| treat their operands consistently as strings. The same applies to the | |
| assignment variants (C<&= |= ^= &.= |.= ^.=>). | |
| To use this, enable the "bitwise" feature and disable the | |
| "experimental::bitwise" warnings category. See L<perlop/Bitwise String | |
| Operators> for details. | |
| L<[GH #14348]|https://github.com/Perl/perl5/issues/14348>. | |
| =head2 New double-diamond operator | |
| C<<< <<>> >>> is like C<< <> >> but uses three-argument C<open> to open | |
| each file in C<@ARGV>. This means that each element of C<@ARGV> will be treated | |
| as an actual file name, and C<"|foo"> won't be treated as a pipe open. | |
| =head2 New C<\b> boundaries in regular expressions | |
| =head3 C<qr/\b{gcb}/> | |
| C<gcb> stands for Grapheme Cluster Boundary. It is a Unicode property | |
| that finds the boundary between sequences of characters that look like a | |
| single character to a native speaker of a language. Perl has long had | |
| the ability to deal with these through the C<\X> regular escape | |
| sequence. Now, there is an alternative way of handling these. See | |
| L<perlrebackslash/\b{}, \b, \B{}, \B> for details. | |
| =head3 C<qr/\b{wb}/> | |
| C<wb> stands for Word Boundary. It is a Unicode property | |
| that finds the boundary between words. This is similar to the plain | |
| C<\b> (without braces) but is more suitable for natural language | |
| processing. It knows, for example, that apostrophes can occur in the | |
| middle of words. See L<perlrebackslash/\b{}, \b, \B{}, \B> for details. | |
| =head3 C<qr/\b{sb}/> | |
| C<sb> stands for Sentence Boundary. It is a Unicode property | |
| to aid in parsing natural language sentences. | |
| See L<perlrebackslash/\b{}, \b, \B{}, \B> for details. | |
| =head2 Non-Capturing Regular Expression Flag | |
| Regular expressions now support a C</n> flag that disables capturing | |
| and filling in C<$1>, C<$2>, etc inside of groups: | |
| "hello" =~ /(hi|hello)/n; # $1 is not set | |
| This is equivalent to putting C<?:> at the beginning of every capturing group. | |
| See L<perlre/"n"> for more information. | |
| =head2 C<use re 'strict'> | |
| This applies stricter syntax rules to regular expression patterns | |
| compiled within its scope. This will hopefully alert you to typos and | |
| other unintentional behavior that backwards-compatibility issues prevent | |
| us from reporting in normal regular expression compilations. Because the | |
| behavior of this is subject to change in future Perl releases as we gain | |
| experience, using this pragma will raise a warning of category | |
| C<experimental::re_strict>. | |
| See L<'strict' in re|re/'strict' mode>. | |
| =head2 Unicode 7.0 (with correction) is now supported | |
| For details on what is in this release, see | |
| L<http://www.unicode.org/versions/Unicode7.0.0/>. | |
| The version of Unicode 7.0 that comes with Perl includes | |
| a correction dealing with glyph shaping in Arabic | |
| (see L<http://www.unicode.org/errata/#current_errata>). | |
| =head2 S<C<use locale>> can restrict which locale categories are affected | |
| It is now possible to pass a parameter to S<C<use locale>> to specify | |
| a subset of locale categories to be locale-aware, with the remaining | |
| ones unaffected. See L<perllocale/The "use locale" pragma> for details. | |
| =head2 Perl now supports POSIX 2008 locale currency additions | |
| On platforms that are able to handle POSIX.1-2008, the | |
| hash returned by | |
| L<C<POSIX::localeconv()>|perllocale/The localeconv function> | |
| includes the international currency fields added by that version of the | |
| POSIX standard. These are | |
| C<int_n_cs_precedes>, | |
| C<int_n_sep_by_space>, | |
| C<int_n_sign_posn>, | |
| C<int_p_cs_precedes>, | |
| C<int_p_sep_by_space>, | |
| and | |
| C<int_p_sign_posn>. | |
| =head2 Better heuristics on older platforms for determining locale UTF-8ness | |
| On platforms that implement neither the C99 standard nor the POSIX 2001 | |
| standard, determining if the current locale is UTF-8 or not depends on | |
| heuristics. These are improved in this release. | |
| =head2 Aliasing via reference | |
| Variables and subroutines can now be aliased by assigning to a reference: | |
| \$c = \$d; | |
| \&x = \&y; | |
| Aliasing can also be accomplished | |
| by using a backslash before a C<foreach> iterator variable; this is | |
| perhaps the most useful idiom this feature provides: | |
| foreach \%hash (@array_of_hash_refs) { ... } | |
| This feature is experimental and must be enabled via S<C<use feature | |
| 'refaliasing'>>. It will warn unless the C<experimental::refaliasing> | |
| warnings category is disabled. | |
| See L<perlref/Assigning to References> | |
| =head2 C<prototype> with no arguments | |
| C<prototype()> with no arguments now infers C<$_>. | |
| L<[GH #14376]|https://github.com/Perl/perl5/issues/14376>. | |
| =head2 New C<:const> subroutine attribute | |
| The C<const> attribute can be applied to an anonymous subroutine. It | |
| causes the new sub to be executed immediately whenever one is created | |
| (I<i.e.> when the C<sub> expression is evaluated). Its value is captured | |
| and used to create a new constant subroutine that is returned. This | |
| feature is experimental. See L<perlsub/Constant Functions>. | |
| =head2 C<fileno> now works on directory handles | |
| When the relevant support is available in the operating system, the | |
| C<fileno> builtin now works on directory handles, yielding the | |
| underlying file descriptor in the same way as for filehandles. On | |
| operating systems without such support, C<fileno> on a directory handle | |
| continues to return the undefined value, as before, but also sets C<$!> to | |
| indicate that the operation is not supported. | |
| Currently, this uses either a C<dd_fd> member in the OS C<DIR> | |
| structure, or a C<dirfd(3)> function as specified by POSIX.1-2008. | |
| =head2 List form of pipe open implemented for Win32 | |
| The list form of pipe: | |
| open my $fh, "-|", "program", @arguments; | |
| is now implemented on Win32. It has the same limitations as C<system | |
| LIST> on Win32, since the Win32 API doesn't accept program arguments | |
| as a list. | |
| =head2 Assignment to list repetition | |
| C<(...) x ...> can now be used within a list that is assigned to, as long | |
| as the left-hand side is a valid lvalue. This allows S<C<(undef,undef,$foo) | |
| = that_function()>> to be written as S<C<((undef)x2, $foo) = that_function()>>. | |
| =head2 Infinity and NaN (not-a-number) handling improved | |
| Floating point values are able to hold the special values infinity, negative | |
| infinity, and NaN (not-a-number). Now we more robustly recognize and | |
| propagate the value in computations, and on output normalize them to the strings | |
| C<Inf>, C<-Inf>, and C<NaN>. | |
| See also the L<POSIX> enhancements. | |
| =head2 Floating point parsing has been improved | |
| Parsing and printing of floating point values has been improved. | |
| As a completely new feature, hexadecimal floating point literals | |
| (like C<0x1.23p-4>) are now supported, and they can be output with | |
| S<C<printf "%a">>. See L<perldata/Scalar value constructors> for more | |
| details. | |
| =head2 Packing infinity or not-a-number into a character is now fatal | |
| Before, when trying to pack infinity or not-a-number into a | |
| (signed) character, Perl would warn, and assumed you tried to | |
| pack C<< 0xFF >>; if you gave it as an argument to C<< chr >>, | |
| C<< U+FFFD >> was returned. | |
| But now, all such actions (C<< pack >>, C<< chr >>, and C<< print '%c' >>) | |
| result in a fatal error. | |
| =head2 Experimental C Backtrace API | |
| Perl now supports (via a C level API) retrieving | |
| the C level backtrace (similar to what symbolic debuggers like gdb do). | |
| The backtrace returns the stack trace of the C call frames, | |
| with the symbol names (function names), the object names (like "perl"), | |
| and if it can, also the source code locations (file:line). | |
| The supported platforms are Linux and OS X (some *BSD might work at | |
| least partly, but they have not yet been tested). | |
| The feature needs to be enabled with C<Configure -Dusecbacktrace>. | |
| See L<perlhacktips/"C backtrace"> for more information. | |
| =head1 Security | |
| =head2 Perl is now compiled with C<-fstack-protector-strong> if available | |
| Perl has been compiled with the anti-stack-smashing option | |
| C<-fstack-protector> since 5.10.1. Now Perl uses the newer variant | |
| called C<-fstack-protector-strong>, if available. | |
| =head2 The L<Safe> module could allow outside packages to be replaced | |
| Critical bugfix: outside packages could be replaced. L<Safe> has | |
| been patched to 2.38 to address this. | |
| =head2 Perl is now always compiled with C<-D_FORTIFY_SOURCE=2> if available | |
| The 'code hardening' option called C<_FORTIFY_SOURCE>, available in | |
| gcc 4.*, is now always used for compiling Perl, if available. | |
| Note that this isn't necessarily a huge step since in many platforms | |
| the step had already been taken several years ago: many Linux | |
| distributions (like Fedora) have been using this option for Perl, | |
| and OS X has enforced the same for many years. | |
| =head1 Incompatible Changes | |
| =head2 Subroutine signatures moved before attributes | |
| The experimental sub signatures feature, as introduced in 5.20, parsed | |
| signatures after attributes. In this release, following feedback from users | |
| of the experimental feature, the positioning has been moved such that | |
| signatures occur after the subroutine name (if any) and before the attribute | |
| list (if any). | |
| =head2 C<&> and C<\&> prototypes accepts only subs | |
| The C<&> prototype character now accepts only anonymous subs (C<sub | |
| {...}>), things beginning with C<\&>, or an explicit C<undef>. Formerly | |
| it erroneously also allowed references to arrays, hashes, and lists. | |
| L<[GH #2776]|https://github.com/Perl/perl5/issues/2776>. | |
| L<[GH #14186]|https://github.com/Perl/perl5/issues/14186>. | |
| L<[GH #14353]|https://github.com/Perl/perl5/issues/14353>. | |
| In addition, the C<\&> prototype was allowing subroutine calls, whereas | |
| now it only allows subroutines: C<&foo> is still permitted as an argument, | |
| while C<&foo()> and C<foo()> no longer are. | |
| L<[GH #10633]|https://github.com/Perl/perl5/issues/10633>. | |
| =head2 C<use encoding> is now lexical | |
| The L<encoding> pragma's effect is now limited to lexical scope. This | |
| pragma is deprecated, but in the meantime, it could adversely affect | |
| unrelated modules that are included in the same program; this change | |
| fixes that. | |
| =head2 List slices returning empty lists | |
| List slices now return an empty list only if the original list was empty | |
| (or if there are no indices). Formerly, a list slice would return an empty | |
| list if all indices fell outside the original list; now it returns a list | |
| of C<undef> values in that case. | |
| L<[GH #12335]|https://github.com/Perl/perl5/issues/12335>. | |
| =head2 C<\N{}> with a sequence of multiple spaces is now a fatal error | |
| E.g. S<C<\N{TOOE<nbsp>E<nbsp>MANY SPACES}>> or S<C<\N{TRAILING SPACE }>>. | |
| This has been deprecated since v5.18. | |
| =head2 S<C<use UNIVERSAL '...'>> is now a fatal error | |
| Importing functions from C<UNIVERSAL> has been deprecated since v5.12, and | |
| is now a fatal error. S<C<use UNIVERSAL>> without any arguments is still | |
| allowed. | |
| =head2 In double-quotish C<\cI<X>>, I<X> must now be a printable ASCII character | |
| In prior releases, failure to do this raised a deprecation warning. | |
| =head2 Splitting the tokens C<(?> and C<(*> in regular expressions is now a fatal compilation error. | |
| These had been deprecated since v5.18. | |
| =head2 C<qr/foo/x> now ignores all Unicode pattern white space | |
| The C</x> regular expression modifier allows the pattern to contain | |
| white space and comments (both of which are ignored) for improved | |
| readability. Until now, not all the white space characters that Unicode | |
| designates for this purpose were handled. The additional ones now | |
| recognized are: | |
| U+0085 NEXT LINE | |
| U+200E LEFT-TO-RIGHT MARK | |
| U+200F RIGHT-TO-LEFT MARK | |
| U+2028 LINE SEPARATOR | |
| U+2029 PARAGRAPH SEPARATOR | |
| The use of these characters with C</x> outside bracketed character | |
| classes and when not preceded by a backslash has raised a deprecation | |
| warning since v5.18. Now they will be ignored. | |
| =head2 Comment lines within S<C<(?[ ])>> are now ended only by a C<\n> | |
| S<C<(?[ ])>> is an experimental feature, introduced in v5.18. It operates | |
| as if C</x> is always enabled. But there was a difference: comment | |
| lines (following a C<#> character) were terminated by anything matching | |
| C<\R> which includes all vertical whitespace, such as form feeds. For | |
| consistency, this is now changed to match what terminates comment lines | |
| outside S<C<(?[ ])>>, namely a C<\n> (even if escaped), which is the | |
| same as what terminates a heredoc string and formats. | |
| =head2 C<(?[...])> operators now follow standard Perl precedence | |
| This experimental feature allows set operations in regular expression patterns. | |
| Prior to this, the intersection operator had the same precedence as the other | |
| binary operators. Now it has higher precedence. This could lead to different | |
| outcomes than existing code expects (though the documentation has always noted | |
| that this change might happen, recommending fully parenthesizing the | |
| expressions). See L<perlrecharclass/Extended Bracketed Character Classes>. | |
| =head2 Omitting C<%> and C<@> on hash and array names is no longer permitted | |
| Really old Perl let you omit the C<@> on array names and the C<%> on hash | |
| names in some spots. This has issued a deprecation warning since Perl | |
| 5.000, and is no longer permitted. | |
| =head2 C<"$!"> text is now in English outside the scope of C<use locale> | |
| Previously, the text, unlike almost everything else, always came out | |
| based on the current underlying locale of the program. (Also affected | |
| on some systems is C<"$^E">.) For programs that are unprepared to | |
| handle locale differences, this can cause garbage text to be displayed. | |
| It's better to display text that is translatable via some tool than | |
| garbage text which is much harder to figure out. | |
| =head2 C<"$!"> text will be returned in UTF-8 when appropriate | |
| The stringification of C<$!> and C<$^E> will have the UTF-8 flag set | |
| when the text is actually non-ASCII UTF-8. This will enable programs | |
| that are set up to be locale-aware to properly output messages in the | |
| user's native language. Code that needs to continue the 5.20 and | |
| earlier behavior can do the stringification within the scopes of both | |
| S<C<use bytes>> and S<C<use locale ":messages">>. Within these two | |
| scopes, no other Perl operations will | |
| be affected by locale; only C<$!> and C<$^E> stringification. The | |
| C<bytes> pragma causes the UTF-8 flag to not be set, just as in previous | |
| Perl releases. This resolves | |
| L<[GH #12035]|https://github.com/Perl/perl5/issues/12035>. | |
| =head2 Support for C<?PATTERN?> without explicit operator has been removed | |
| The C<m?PATTERN?> construct, which allows matching a regex only once, | |
| previously had an alternative form that was written directly with a question | |
| mark delimiter, omitting the explicit C<m> operator. This usage has produced | |
| a deprecation warning since 5.14.0. It is now a syntax error, so that the | |
| question mark can be available for use in new operators. | |
| =head2 C<defined(@array)> and C<defined(%hash)> are now fatal errors | |
| These have been deprecated since v5.6.1 and have raised deprecation | |
| warnings since v5.16. | |
| =head2 Using a hash or an array as a reference are now fatal errors | |
| For example, C<< %foo->{"bar"} >> now causes a fatal compilation | |
| error. These have been deprecated since before v5.8, and have raised | |
| deprecation warnings since then. | |
| =head2 Changes to the C<*> prototype | |
| The C<*> character in a subroutine's prototype used to allow barewords to take | |
| precedence over most, but not all, subroutine names. It was never | |
| consistent and exhibited buggy behavior. | |
| Now it has been changed, so subroutines always take precedence over barewords, | |
| which brings it into conformity with similarly prototyped built-in functions: | |
| sub splat(*) { ... } | |
| sub foo { ... } | |
| splat(foo); # now always splat(foo()) | |
| splat(bar); # still splat('bar') as before | |
| close(foo); # close(foo()) | |
| close(bar); # close('bar') | |
| =head1 Deprecations | |
| =head2 Setting C<${^ENCODING}> to anything but C<undef> | |
| This variable allows Perl scripts to be written in an encoding other than | |
| ASCII or UTF-8. However, it affects all modules globally, leading | |
| to wrong answers and segmentation faults. New scripts should be written | |
| in UTF-8; old scripts should be converted to UTF-8, which is easily done | |
| with the L<piconv> utility. | |
| =head2 Use of non-graphic characters in single-character variable names | |
| The syntax for single-character variable names is more lenient than | |
| for longer variable names, allowing the one-character name to be a | |
| punctuation character or even invisible (a non-graphic). Perl v5.20 | |
| deprecated the ASCII-range controls as such a name. Now, all | |
| non-graphic characters that formerly were allowed are deprecated. | |
| The practical effect of this occurs only when not under C<S<use | |
| utf8>>, and affects just the C1 controls (code points 0x80 through | |
| 0xFF), NO-BREAK SPACE, and SOFT HYPHEN. | |
| =head2 Inlining of C<sub () { $var }> with observable side-effects | |
| In many cases Perl makes S<C<sub () { $var }>> into an inlinable constant | |
| subroutine, capturing the value of C<$var> at the time the C<sub> expression | |
| is evaluated. This can break the closure behavior in those cases where | |
| C<$var> is subsequently modified, since the subroutine won't return the | |
| changed value. (Note that this all only applies to anonymous subroutines | |
| with an empty prototype (S<C<sub ()>>).) | |
| This usage is now deprecated in those cases where the variable could be | |
| modified elsewhere. Perl detects those cases and emits a deprecation | |
| warning. Such code will likely change in the future and stop producing a | |
| constant. | |
| If your variable is only modified in the place where it is declared, then | |
| Perl will continue to make the sub inlinable with no warnings. | |
| sub make_constant { | |
| my $var = shift; | |
| return sub () { $var }; # fine | |
| } | |
| sub make_constant_deprecated { | |
| my $var; | |
| $var = shift; | |
| return sub () { $var }; # deprecated | |
| } | |
| sub make_constant_deprecated2 { | |
| my $var = shift; | |
| log_that_value($var); # could modify $var | |
| return sub () { $var }; # deprecated | |
| } | |
| In the second example above, detecting that C<$var> is assigned to only once | |
| is too hard to detect. That it happens in a spot other than the C<my> | |
| declaration is enough for Perl to find it suspicious. | |
| This deprecation warning happens only for a simple variable for the body of | |
| the sub. (A C<BEGIN> block or C<use> statement inside the sub is ignored, | |
| because it does not become part of the sub's body.) For more complex | |
| cases, such as S<C<sub () { do_something() if 0; $var }>> the behavior has | |
| changed such that inlining does not happen if the variable is modifiable | |
| elsewhere. Such cases should be rare. | |
| =head2 Use of multiple C</x> regexp modifiers | |
| It is now deprecated to say something like any of the following: | |
| qr/foo/xx; | |
| /(?xax:foo)/; | |
| use re qw(/amxx); | |
| That is, now C<x> should only occur once in any string of contiguous | |
| regular expression pattern modifiers. We do not believe there are any | |
| occurrences of this in all of CPAN. This is in preparation for a future | |
| Perl release having C</xx> permit white-space for readability in | |
| bracketed character classes (those enclosed in square brackets: | |
| C<[...]>). | |
| =head2 Using a NO-BREAK space in a character alias for C<\N{...}> is now deprecated | |
| This non-graphic character is essentially indistinguishable from a | |
| regular space, and so should not be allowed. See | |
| L<charnames/CUSTOM ALIASES>. | |
| =head2 A literal C<"{"> should now be escaped in a pattern | |
| If you want a literal left curly bracket (also called a left brace) in a | |
| regular expression pattern, you should now escape it by either | |
| preceding it with a backslash (C<"\{">) or enclosing it within square | |
| brackets C<"[{]">, or by using C<\Q>; otherwise a deprecation warning | |
| will be raised. This was first announced as forthcoming in the v5.16 | |
| release; it will allow future extensions to the language to happen. | |
| =head2 Making all warnings fatal is discouraged | |
| The documentation for L<fatal warnings|warnings/Fatal Warnings> notes that | |
| C<< use warnings FATAL => 'all' >> is discouraged, and provides stronger | |
| language about the risks of fatal warnings in general. | |
| =head1 Performance Enhancements | |
| =over 4 | |
| =item * | |
| If a method or class name is known at compile time, a hash is precomputed | |
| to speed up run-time method lookup. Also, compound method names like | |
| C<SUPER::new> are parsed at compile time, to save having to parse them at | |
| run time. | |
| =item * | |
| Array and hash lookups (especially nested ones) that use only constants | |
| or simple variables as keys, are now considerably faster. See | |
| L</Internal Changes> for more details. | |
| =item * | |
| C<(...)x1>, C<("constant")x0> and C<($scalar)x0> are now optimised in list | |
| context. If the right-hand argument is a constant 1, the repetition | |
| operator disappears. If the right-hand argument is a constant 0, the whole | |
| expression is optimised to the empty list, so long as the left-hand | |
| argument is a simple scalar or constant. (That is, C<(foo())x0> is not | |
| subject to this optimisation.) | |
| =item * | |
| C<substr> assignment is now optimised into 4-argument C<substr> at the end | |
| of a subroutine (or as the argument to C<return>). Previously, this | |
| optimisation only happened in void context. | |
| =item * | |
| In C<"\L...">, C<"\Q...">, etc., the extra "stringify" op is now optimised | |
| away, making these just as fast as C<lcfirst>, C<quotemeta>, etc. | |
| =item * | |
| Assignment to an empty list is now sometimes faster. In particular, it | |
| never calls C<FETCH> on tied arguments on the right-hand side, whereas it | |
| used to sometimes. | |
| =item * | |
| There is a performance improvement of up to 20% when C<length> is applied to | |
| a non-magical, non-tied string, and either C<use bytes> is in scope or the | |
| string doesn't use UTF-8 internally. | |
| =item * | |
| On most perl builds with 64-bit integers, memory usage for non-magical, | |
| non-tied scalars containing only a floating point value has been reduced | |
| by between 8 and 32 bytes, depending on OS. | |
| =item * | |
| In C<@array = split>, the assignment can be optimized away, so that C<split> | |
| writes directly to the array. This optimisation was happening only for | |
| package arrays other than C<@_>, and only sometimes. Now this | |
| optimisation happens almost all the time. | |
| =item * | |
| C<join> is now subject to constant folding. So for example | |
| S<C<join "-", "a", "b">> is converted at compile-time to C<"a-b">. | |
| Moreover, C<join> with a scalar or constant for the separator and a | |
| single-item list to join is simplified to a stringification, and the | |
| separator doesn't even get evaluated. | |
| =item * | |
| C<qq(@array)> is implemented using two ops: a stringify op and a join op. | |
| If the C<qq> contains nothing but a single array, the stringification is | |
| optimized away. | |
| =item * | |
| S<C<our $var>> and S<C<our($s,@a,%h)>> in void context are no longer evaluated at | |
| run time. Even a whole sequence of S<C<our $foo;>> statements will simply be | |
| skipped over. The same applies to C<state> variables. | |
| =item * | |
| Many internal functions have been refactored to improve performance and reduce | |
| their memory footprints. | |
| L<[GH #13659]|https://github.com/Perl/perl5/issues/13659> | |
| L<[GH #13856]|https://github.com/Perl/perl5/issues/13856> | |
| L<[GH #13874]|https://github.com/Perl/perl5/issues/13874> | |
| =item * | |
| C<-T> and C<-B> filetests will return sooner when an empty file is detected. | |
| L<[GH #13686]|https://github.com/Perl/perl5/issues/13686> | |
| =item * | |
| Hash lookups where the key is a constant are faster. | |
| =item * | |
| Subroutines with an empty prototype and a body containing just C<undef> are now | |
| eligible for inlining. | |
| L<[GH #14077]|https://github.com/Perl/perl5/issues/14077> | |
| =item * | |
| Subroutines in packages no longer need to be stored in typeglobs: | |
| declaring a subroutine will now put a simple sub reference directly in the | |
| stash if possible, saving memory. The typeglob still notionally exists, | |
| so accessing it will cause the stash entry to be upgraded to a typeglob | |
| (I<i.e.> this is just an internal implementation detail). | |
| This optimization does not currently apply to XSUBs or exported | |
| subroutines, and method calls will undo it, since they cache things in | |
| typeglobs. | |
| L<[GH #13392]|https://github.com/Perl/perl5/issues/13392> | |
| =item * | |
| The functions C<utf8::native_to_unicode()> and C<utf8::unicode_to_native()> | |
| (see L<utf8>) are now optimized out on ASCII platforms. There is now not even | |
| a minimal performance hit in writing code portable between ASCII and EBCDIC | |
| platforms. | |
| =item * | |
| Win32 Perl uses 8 KB less of per-process memory than before for every perl | |
| process, because some data is now memory mapped from disk and shared | |
| between processes from the same perl binary. | |
| =back | |
| =head1 Modules and Pragmata | |
| =head2 Updated Modules and Pragmata | |
| Many of the libraries distributed with perl have been upgraded since v5.20.0. | |
| For a complete list of changes, run: | |
| corelist --diff 5.20.0 5.22.0 | |
| You can substitute your favorite version in place of 5.20.0, too. | |
| Some notable changes include: | |
| =over 4 | |
| =item * | |
| L<Archive::Tar> has been upgraded to version 2.04. | |
| Tests can now be run in parallel. | |
| =item * | |
| L<attributes> has been upgraded to version 0.27. | |
| The usage of C<memEQs> in the XS has been corrected. | |
| L<[GH #14072]|https://github.com/Perl/perl5/issues/14072> | |
| Avoid reading beyond the end of a buffer. [perl #122629] | |
| =item * | |
| L<B> has been upgraded to version 1.58. | |
| It provides a new C<B::safename> function, based on the existing | |
| C<< B::GV->SAFENAME >>, that converts C<\cOPEN> to C<^OPEN>. | |
| Nulled COPs are now of class C<B::COP>, rather than C<B::OP>. | |
| C<B::REGEXP> objects now provide a C<qr_anoncv> method for accessing the | |
| implicit CV associated with C<qr//> things containing code blocks, and a | |
| C<compflags> method that returns the pertinent flags originating from the | |
| C<qr//blahblah> op. | |
| C<B::PMOP> now provides a C<pmregexp> method returning a C<B::REGEXP> object. | |
| Two new classes, C<B::PADNAME> and C<B::PADNAMELIST>, have been introduced. | |
| A bug where, after an ithread creation or pseudofork, special/immortal SVs in | |
| the child ithread/pseudoprocess did not have the correct class of | |
| C<B::SPECIAL>, has been fixed. | |
| The C<id> and C<outid> PADLIST methods have been added. | |
| =item * | |
| L<B::Concise> has been upgraded to version 0.996. | |
| Null ops that are part of the execution chain are now given sequence | |
| numbers. | |
| Private flags for nulled ops are now dumped with mnemonics as they would be | |
| for the non-nulled counterparts. | |
| =item * | |
| L<B::Deparse> has been upgraded to version 1.35. | |
| It now deparses C<+sub : attr { ... }> correctly at the start of a | |
| statement. Without the initial C<+>, C<sub> would be a statement label. | |
| C<BEGIN> blocks are now emitted in the right place most of the time, but | |
| the change unfortunately introduced a regression, in that C<BEGIN> blocks | |
| occurring just before the end of the enclosing block may appear below it | |
| instead. | |
| C<B::Deparse> no longer puts erroneous C<local> here and there, such as for | |
| C<LIST = tr/a//d>. [perl #119815] | |
| Adjacent C<use> statements are no longer accidentally nested if one | |
| contains a C<do> block. [perl #115066] | |
| Parenthesised arrays in lists passed to C<\> are now correctly deparsed | |
| with parentheses (I<e.g.>, C<\(@a, (@b), @c)> now retains the parentheses | |
| around @b), thus preserving the flattening behavior of referenced | |
| parenthesised arrays. Formerly, it only worked for one array: C<\(@a)>. | |
| C<local our> is now deparsed correctly, with the C<our> included. | |
| C<for($foo; !$bar; $baz) {...}> was deparsed without the C<!> (or C<not>). | |
| This has been fixed. | |
| Core keywords that conflict with lexical subroutines are now deparsed with | |
| the C<CORE::> prefix. | |
| C<foreach state $x (...) {...}> now deparses correctly with C<state> and | |
| not C<my>. | |
| C<our @array = split(...)> now deparses correctly with C<our> in those | |
| cases where the assignment is optimized away. | |
| It now deparses C<our(I<LIST>)> and typed lexical (C<my Dog $spot>) correctly. | |
| Deparse C<$#_> as that instead of as C<$#{_}>. | |
| L<[GH #14545]|https://github.com/Perl/perl5/issues/14545> | |
| BEGIN blocks at the end of the enclosing scope are now deparsed in the | |
| right place. [perl #77452] | |
| BEGIN blocks were sometimes deparsed as __ANON__, but are now always called | |
| BEGIN. | |
| Lexical subroutines are now fully deparsed. [perl #116553] | |
| C<Anything =~ y///r> with C</r> no longer omits the left-hand operand. | |
| The op trees that make up regexp code blocks are now deparsed for real. | |
| Formerly, the original string that made up the regular expression was used. | |
| That caused problems with C<qr/(?{E<lt>E<lt>heredoc})/> and multiline code blocks, | |
| which were deparsed incorrectly. [perl #123217] [perl #115256] | |
| C<$;> at the end of a statement no longer loses its semicolon. | |
| [perl #123357] | |
| Some cases of subroutine declarations stored in the stash in shorthand form | |
| were being omitted. | |
| Non-ASCII characters are now consistently escaped in strings, instead of | |
| some of the time. (There are still outstanding problems with regular | |
| expressions and identifiers that have not been fixed.) | |
| When prototype sub calls are deparsed with C<&> (I<e.g.>, under the B<-P> | |
| option), C<scalar> is now added where appropriate, to force the scalar | |
| context implied by the prototype. | |
| C<require(foo())>, C<do(foo())>, C<goto(foo())> and similar constructs with | |
| loop controls are now deparsed correctly. The outer parentheses are not | |
| optional. | |
| Whitespace is no longer escaped in regular expressions, because it was | |
| getting erroneously escaped within C<(?x:...)> sections. | |
| C<sub foo { foo() }> is now deparsed with those mandatory parentheses. | |
| C</@array/> is now deparsed as a regular expression, and not just | |
| C<@array>. | |
| C</@{-}/>, C</@{+}/> and C<$#{1}> are now deparsed with the braces, which | |
| are mandatory in these cases. | |
| In deparsing feature bundles, C<B::Deparse> was emitting C<no feature;> first | |
| instead of C<no feature ':all';>. This has been fixed. | |
| C<chdir FH> is now deparsed without quotation marks. | |
| C<\my @a> is now deparsed without parentheses. (Parenthese would flatten | |
| the array.) | |
| C<system> and C<exec> followed by a block are now deparsed correctly. | |
| Formerly there was an erroneous C<do> before the block. | |
| C<< use constant QR =E<gt> qr/.../flags >> followed by C<"" =~ QR> is no longer | |
| without the flags. | |
| Deparsing C<BEGIN { undef &foo }> with the B<-w> switch enabled started to | |
| emit 'uninitialized' warnings in Perl 5.14. This has been fixed. | |
| Deparsing calls to subs with a C<(;+)> prototype resulted in an infinite | |
| loop. The C<(;$>) C<(_)> and C<(;_)> prototypes were given the wrong | |
| precedence, causing C<foo($aE<lt>$b)> to be deparsed without the parentheses. | |
| Deparse now provides a defined state sub in inner subs. | |
| =item * | |
| L<B::Op_private> has been added. | |
| L<B::Op_private> provides detailed information about the flags used in the | |
| C<op_private> field of perl opcodes. | |
| =item * | |
| L<bigint>, L<bignum>, L<bigrat> have been upgraded to version 0.39. | |
| Document in CAVEATS that using strings as numbers won't always invoke | |
| the big number overloading, and how to invoke it. [rt.perl.org #123064] | |
| =item * | |
| L<Carp> has been upgraded to version 1.36. | |
| C<Carp::Heavy> now ignores version mismatches with Carp if Carp is newer | |
| than 1.12, since C<Carp::Heavy>'s guts were merged into Carp at that | |
| point. | |
| L<[GH #13708]|https://github.com/Perl/perl5/issues/13708> | |
| Carp now handles non-ASCII platforms better. | |
| Off-by-one error fix for Perl E<lt> 5.14. | |
| =item * | |
| L<constant> has been upgraded to version 1.33. | |
| It now accepts fully-qualified constant names, allowing constants to be defined | |
| in packages other than the caller. | |
| =item * | |
| L<CPAN> has been upgraded to version 2.11. | |
| Add support for C<Cwd::getdcwd()> and introduce workaround for a misbehavior | |
| seen on Strawberry Perl 5.20.1. | |
| Fix C<chdir()> after building dependencies bug. | |
| Introduce experimental support for plugins/hooks. | |
| Integrate the C<App::Cpan> sources. | |
| Do not check recursion on optional dependencies. | |
| Sanity check F<META.yml> to contain a hash. | |
| L<[cpan #95271]|https://rt.cpan.org/Ticket/Display.html?id=95271> | |
| =item * | |
| L<CPAN::Meta::Requirements> has been upgraded to version 2.132. | |
| Works around limitations in C<version::vpp> detecting v-string magic and adds | |
| support for forthcoming L<ExtUtils::MakeMaker> bootstrap F<version.pm> for | |
| Perls older than 5.10.0. | |
| =item * | |
| L<Data::Dumper> has been upgraded to version 2.158. | |
| Fixes CVE-2014-4330 by adding a configuration variable/option to limit | |
| recursion when dumping deep data structures. | |
| Changes to resolve Coverity issues. | |
| XS dumps incorrectly stored the name of code references stored in a | |
| GLOB. | |
| L<[GH #13911]|https://github.com/Perl/perl5/issues/13911> | |
| =item * | |
| L<DynaLoader> has been upgraded to version 1.32. | |
| Remove C<dl_nonlazy> global if unused in Dynaloader. [perl #122926] | |
| =item * | |
| L<Encode> has been upgraded to version 2.72. | |
| C<piconv> now has better error handling when the encoding name is nonexistent, | |
| and a build breakage when upgrading L<Encode> in perl-5.8.2 and earlier has | |
| been fixed. | |
| Building in C++ mode on Windows now works. | |
| =item * | |
| L<Errno> has been upgraded to version 1.23. | |
| Add C<-P> to the preprocessor command-line on GCC 5. GCC added extra | |
| line directives, breaking parsing of error code definitions. [rt.perl.org | |
| #123784] | |
| =item * | |
| L<experimental> has been upgraded to version 0.013. | |
| Hardcodes features for Perls older than 5.15.7. | |
| =item * | |
| L<ExtUtils::CBuilder> has been upgraded to version 0.280221. | |
| Fixes a regression on Android. | |
| L<[GH #14064]|https://github.com/Perl/perl5/issues/14064> | |
| =item * | |
| L<ExtUtils::Manifest> has been upgraded to version 1.70. | |
| Fixes a bug with C<maniread()>'s handling of quoted filenames and improves | |
| C<manifind()> to follow symlinks. | |
| L<[GH #14003]|https://github.com/Perl/perl5/issues/14003> | |
| =item * | |
| L<ExtUtils::ParseXS> has been upgraded to version 3.28. | |
| Only declare C<file> unused if we actually define it. | |
| Improve generated C<RETVAL> code generation to avoid repeated | |
| references to C<ST(0)>. [perl #123278] | |
| Broaden and document the C</OBJ$/> to C</REF$/> typemap optimization | |
| for the C<DESTROY> method. [perl #123418] | |
| =item * | |
| L<Fcntl> has been upgraded to version 1.13. | |
| Add support for the Linux pipe buffer size C<fcntl()> commands. | |
| =item * | |
| L<File::Find> has been upgraded to version 1.29. | |
| C<find()> and C<finddepth()> will now warn if passed inappropriate or | |
| misspelled options. | |
| =item * | |
| L<File::Glob> has been upgraded to version 1.24. | |
| Avoid C<SvIV()> expanding to call C<get_sv()> three times in a few | |
| places. [perl #123606] | |
| =item * | |
| L<HTTP::Tiny> has been upgraded to version 0.054. | |
| C<keep_alive> is now fork-safe and thread-safe. | |
| =item * | |
| L<IO> has been upgraded to version 1.35. | |
| The XS implementation has been fixed for the sake of older Perls. | |
| =item * | |
| L<IO::Socket> has been upgraded to version 1.38. | |
| Document the limitations of the C<connected()> method. [perl #123096] | |
| =item * | |
| L<IO::Socket::IP> has been upgraded to version 0.37. | |
| A better fix for subclassing C<connect()>. | |
| L<[cpan #95983]|https://rt.cpan.org/Ticket/Display.html?id=95983> | |
| L<[cpan #97050]|https://rt.cpan.org/Ticket/Display.html?id=97050> | |
| Implements Timeout for C<connect()>. | |
| L<[cpan #92075]|https://rt.cpan.org/Ticket/Display.html?id=92075> | |
| =item * | |
| The libnet collection of modules has been upgraded to version 3.05. | |
| Support for IPv6 and SSL to C<Net::FTP>, C<Net::NNTP>, C<Net::POP3> and C<Net::SMTP>. | |
| Improvements in C<Net::SMTP> authentication. | |
| =item * | |
| L<Locale::Codes> has been upgraded to version 3.34. | |
| Fixed a bug in the scripts used to extract data from spreadsheets that | |
| prevented the SHP currency code from being found. | |
| L<[cpan #94229]|https://rt.cpan.org/Ticket/Display.html?id=94229> | |
| New codes have been added. | |
| =item * | |
| L<Math::BigInt> has been upgraded to version 1.9997. | |
| Synchronize POD changes from the CPAN release. | |
| C<< Math::BigFloat->blog(x) >> would sometimes return C<blog(2*x)> when | |
| the accuracy was greater than 70 digits. | |
| The result of C<< Math::BigFloat->bdiv() >> in list context now | |
| satisfies C<< x = quotient * divisor + remainder >>. | |
| Correct handling of subclasses. | |
| L<[cpan #96254]|https://rt.cpan.org/Ticket/Display.html?id=96254> | |
| L<[cpan #96329]|https://rt.cpan.org/Ticket/Display.html?id=96329> | |
| =item * | |
| L<Module::Metadata> has been upgraded to version 1.000026. | |
| Support installations on older perls with an L<ExtUtils::MakeMaker> earlier | |
| than 6.63_03 | |
| =item * | |
| L<overload> has been upgraded to version 1.26. | |
| A redundant C<ref $sub> check has been removed. | |
| =item * | |
| The PathTools module collection has been upgraded to version 3.56. | |
| A warning from the B<gcc> compiler is now avoided when building the XS. | |
| Don't turn leading C<//> into C</> on Cygwin. [perl #122635] | |
| =item * | |
| L<perl5db.pl> has been upgraded to version 1.49. | |
| The debugger would cause an assertion failure. | |
| L<[GH #14605]|https://github.com/Perl/perl5/issues/14605> | |
| C<fork()> in the debugger under C<tmux> will now create a new window for | |
| the forked process. L<[GH #13602]|https://github.com/Perl/perl5/issues/13602> | |
| The debugger now saves the current working directory on startup and | |
| restores it when you restart your program with C<R> or C<rerun>. | |
| L<[GH #13691]|https://github.com/Perl/perl5/issues/13691> | |
| =item * | |
| L<PerlIO::scalar> has been upgraded to version 0.22. | |
| Reading from a position well past the end of the scalar now correctly | |
| returns end of file. [perl #123443] | |
| Seeking to a negative position still fails, but no longer leaves the | |
| file position set to a negation location. | |
| C<eof()> on a C<PerlIO::scalar> handle now properly returns true when | |
| the file position is past the 2GB mark on 32-bit systems. | |
| Attempting to write at file positions impossible for the platform now | |
| fail early rather than wrapping at 4GB. | |
| =item * | |
| L<Pod::Perldoc> has been upgraded to version 3.25. | |
| Filehandles opened for reading or writing now have C<:encoding(UTF-8)> set. | |
| L<[cpan #98019]|https://rt.cpan.org/Ticket/Display.html?id=98019> | |
| =item * | |
| L<POSIX> has been upgraded to version 1.53. | |
| The C99 math functions and constants (for example C<acosh>, C<isinf>, C<isnan>, C<round>, | |
| C<trunc>; C<M_E>, C<M_SQRT2>, C<M_PI>) have been added. | |
| C<POSIX::tmpnam()> now produces a deprecation warning. [perl #122005] | |
| =item * | |
| L<Safe> has been upgraded to version 2.39. | |
| C<reval> was not propagating void context properly. | |
| =item * | |
| Scalar-List-Utils has been upgraded to version 1.41. | |
| A new module, L<Sub::Util>, has been added, containing functions related to | |
| CODE refs, including C<subname> (inspired by C<Sub::Identity>) and C<set_subname> | |
| (copied and renamed from C<Sub::Name>). | |
| The use of C<GetMagic> in C<List::Util::reduce()> has also been fixed. | |
| L<[cpan #63211]|https://rt.cpan.org/Ticket/Display.html?id=63211> | |
| =item * | |
| L<SDBM_File> has been upgraded to version 1.13. | |
| Simplified the build process. [perl #123413] | |
| =item * | |
| L<Time::Piece> has been upgraded to version 1.29. | |
| When pretty printing negative C<Time::Seconds>, the "minus" is no longer lost. | |
| =item * | |
| L<Unicode::Collate> has been upgraded to version 1.12. | |
| Version 0.67's improved discontiguous contractions is invalidated by default | |
| and is supported as a parameter C<long_contraction>. | |
| =item * | |
| L<Unicode::Normalize> has been upgraded to version 1.18. | |
| The XSUB implementation has been removed in favor of pure Perl. | |
| =item * | |
| L<Unicode::UCD> has been upgraded to version 0.61. | |
| A new function L<property_values()|Unicode::UCD/prop_values()> | |
| has been added to return a given property's possible values. | |
| A new function L<charprop()|Unicode::UCD/charprop()> | |
| has been added to return the value of a given property for a given code | |
| point. | |
| A new function L<charprops_all()|Unicode::UCD/charprops_all()> | |
| has been added to return the values of all Unicode properties for a | |
| given code point. | |
| A bug has been fixed so that L<propaliases()|Unicode::UCD/prop_aliases()> | |
| returns the correct short and long names for the Perl extensions where | |
| it was incorrect. | |
| A bug has been fixed so that | |
| L<prop_value_aliases()|Unicode::UCD/prop_value_aliases()> | |
| returns C<undef> instead of a wrong result for properties that are Perl | |
| extensions. | |
| This module now works on EBCDIC platforms. | |
| =item * | |
| L<utf8> has been upgraded to version 1.17 | |
| A mismatch between the documentation and the code in C<utf8::downgrade()> | |
| was fixed in favor of the documentation. The optional second argument | |
| is now correctly treated as a perl boolean (true/false semantics) and | |
| not as an integer. | |
| =item * | |
| L<version> has been upgraded to version 0.9909. | |
| Numerous changes. See the F<Changes> file in the CPAN distribution for | |
| details. | |
| =item * | |
| L<Win32> has been upgraded to version 0.51. | |
| C<GetOSName()> now supports Windows 8.1, and building in C++ mode now works. | |
| =item * | |
| L<Win32API::File> has been upgraded to version 0.1202 | |
| Building in C++ mode now works. | |
| =item * | |
| L<XSLoader> has been upgraded to version 0.20. | |
| Allow XSLoader to load modules from a different namespace. | |
| [perl #122455] | |
| =back | |
| =head2 Removed Modules and Pragmata | |
| The following modules (and associated modules) have been removed from the core | |
| perl distribution: | |
| =over 4 | |
| =item * | |
| L<CGI> | |
| =item * | |
| L<Module::Build> | |
| =back | |
| =head1 Documentation | |
| =head2 New Documentation | |
| =head3 L<perlunicook> | |
| This document, by Tom Christiansen, provides examples of handling Unicode in | |
| Perl. | |
| =head2 Changes to Existing Documentation | |
| =head3 L<perlaix> | |
| =over 4 | |
| =item * | |
| A note on long doubles has been added. | |
| =back | |
| =head3 L<perlapi> | |
| =over 4 | |
| =item * | |
| Note that C<SvSetSV> doesn't do set magic. | |
| =item * | |
| C<sv_usepvn_flags> - fix documentation to mention the use of C<Newx> instead of | |
| C<malloc>. | |
| L<[GH #13835]|https://github.com/Perl/perl5/issues/13835> | |
| =item * | |
| Clarify where C<NUL> may be embedded or is required to terminate a string. | |
| =item * | |
| Some documentation that was previously missing due to formatting errors is | |
| now included. | |
| =item * | |
| Entries are now organized into groups rather than by the file where they | |
| are found. | |
| =item * | |
| Alphabetical sorting of entries is now done consistently (automatically | |
| by the POD generator) to make entries easier to find when scanning. | |
| =back | |
| =head3 L<perldata> | |
| =over 4 | |
| =item * | |
| The syntax of single-character variable names has been brought | |
| up-to-date and more fully explained. | |
| =item * | |
| Hexadecimal floating point numbers are described, as are infinity and | |
| NaN. | |
| =back | |
| =head3 L<perlebcdic> | |
| =over 4 | |
| =item * | |
| This document has been significantly updated in the light of recent | |
| improvements to EBCDIC support. | |
| =back | |
| =head3 L<perlfilter> | |
| =over 4 | |
| =item * | |
| Added a L<LIMITATIONS|perlfilter/LIMITATIONS> section. | |
| =back | |
| =head3 L<perlfunc> | |
| =over 4 | |
| =item * | |
| Mention that C<study()> is currently a no-op. | |
| =item * | |
| Calling C<delete> or C<exists> on array values is now described as "strongly | |
| discouraged" rather than "deprecated". | |
| =item * | |
| Improve documentation of C<< our >>. | |
| =item * | |
| C<-l> now notes that it will return false if symlinks aren't supported by the | |
| file system. | |
| L<[GH #13695]|https://github.com/Perl/perl5/issues/13695> | |
| =item * | |
| Note that C<exec LIST> and C<system LIST> may fall back to the shell on | |
| Win32. Only the indirect-object syntax C<exec PROGRAM LIST> and | |
| C<system PROGRAM LIST> will reliably avoid using the shell. | |
| This has also been noted in L<perlport>. | |
| L<[GH #13907]|https://github.com/Perl/perl5/issues/13907> | |
| =back | |
| =head3 L<perlguts> | |
| =over 4 | |
| =item * | |
| The OOK example has been updated to account for COW changes and a change in the | |
| storage of the offset. | |
| =item * | |
| Details on C level symbols and libperl.t added. | |
| =item * | |
| Information on Unicode handling has been added | |
| =item * | |
| Information on EBCDIC handling has been added | |
| =back | |
| =head3 L<perlhack> | |
| =over 4 | |
| =item * | |
| A note has been added about running on platforms with non-ASCII | |
| character sets | |
| =item * | |
| A note has been added about performance testing | |
| =back | |
| =head3 L<perlhacktips> | |
| =over 4 | |
| =item * | |
| Documentation has been added illustrating the perils of assuming that | |
| there is no change to the contents of static memory pointed to by the | |
| return values of Perl's wrappers for C library functions. | |
| =item * | |
| Replacements for C<tmpfile>, C<atoi>, C<strtol>, and C<strtoul> are now | |
| recommended. | |
| =item * | |
| Updated documentation for the C<test.valgrind> C<make> target. | |
| L<[GH #13658]|https://github.com/Perl/perl5/issues/13658> | |
| =item * | |
| Information is given about writing test files portably to non-ASCII | |
| platforms. | |
| =item * | |
| A note has been added about how to get a C language stack backtrace. | |
| =back | |
| =head3 L<perlhpux> | |
| =over 4 | |
| =item * | |
| Note that the message "Redeclaration of "sendpath" with a different | |
| storage class specifier" is harmless. | |
| =back | |
| =head3 L<perllocale> | |
| =over 4 | |
| =item * | |
| Updated for the enhancements in v5.22, along with some clarifications. | |
| =back | |
| =head3 L<perlmodstyle> | |
| =over 4 | |
| =item * | |
| Instead of pointing to the module list, we are now pointing to | |
| L<PrePAN|http://prepan.org/>. | |
| =back | |
| =head3 L<perlop> | |
| =over 4 | |
| =item * | |
| Updated for the enhancements in v5.22, along with some clarifications. | |
| =back | |
| =head3 L<perlpodspec> | |
| =over 4 | |
| =item * | |
| The specification of the pod language is changing so that the default | |
| encoding of pods that aren't in UTF-8 (unless otherwise indicated) is | |
| CP1252 instead of ISO 8859-1 (Latin1). | |
| =back | |
| =head3 L<perlpolicy> | |
| =over 4 | |
| =item * | |
| We now have a code of conduct for the I<< p5p >> mailing list, as documented | |
| in L<< perlpolicy/STANDARDS OF CONDUCT >>. | |
| =item * | |
| The conditions for marking an experimental feature as non-experimental are now | |
| set out. | |
| =item * | |
| Clarification has been made as to what sorts of changes are permissible in | |
| maintenance releases. | |
| =back | |
| =head3 L<perlport> | |
| =over 4 | |
| =item * | |
| Out-of-date VMS-specific information has been fixed and/or simplified. | |
| =item * | |
| Notes about EBCDIC have been added. | |
| =back | |
| =head3 L<perlre> | |
| =over 4 | |
| =item * | |
| The description of the C</x> modifier has been clarified to note that | |
| comments cannot be continued onto the next line by escaping them; and | |
| there is now a list of all the characters that are considered whitespace | |
| by this modifier. | |
| =item * | |
| The new C</n> modifier is described. | |
| =item * | |
| A note has been added on how to make bracketed character class ranges | |
| portable to non-ASCII machines. | |
| =back | |
| =head3 L<perlrebackslash> | |
| =over 4 | |
| =item * | |
| Added documentation of C<\b{sb}>, C<\b{wb}>, C<\b{gcb}>, and C<\b{g}>. | |
| =back | |
| =head3 L<perlrecharclass> | |
| =over 4 | |
| =item * | |
| Clarifications have been added to L<perlrecharclass/Character Ranges> | |
| to the effect C<[A-Z]>, C<[a-z]>, C<[0-9]> and | |
| any subranges thereof in regular expression bracketed character classes | |
| are guaranteed to match exactly what a naive English speaker would | |
| expect them to match, even on platforms (such as EBCDIC) where perl | |
| has to do extra work to accomplish this. | |
| =item * | |
| The documentation of Bracketed Character Classes has been expanded to cover the | |
| improvements in C<qr/[\N{named sequence}]/> (see under L</Selected Bug Fixes>). | |
| =back | |
| =head3 L<perlref> | |
| =over 4 | |
| =item * | |
| A new section has been added | |
| L<Assigning to References|perlref/Assigning to References> | |
| =back | |
| =head3 L<perlsec> | |
| =over 4 | |
| =item * | |
| Comments added on algorithmic complexity and tied hashes. | |
| =back | |
| =head3 L<perlsyn> | |
| =over 4 | |
| =item * | |
| An ambiguity in the documentation of the C<...> statement has been corrected. | |
| L<[GH #14054]|https://github.com/Perl/perl5/issues/14054> | |
| =item * | |
| The empty conditional in C<< for >> and C<< while >> is now documented | |
| in L<< perlsyn >>. | |
| =back | |
| =head3 L<perlunicode> | |
| =over 4 | |
| =item * | |
| This has had extensive revisions to bring it up-to-date with current | |
| Unicode support and to make it more readable. Notable is that Unicode | |
| 7.0 changed what it should do with non-characters. Perl retains the old | |
| way of handling for reasons of backward compatibility. See | |
| L<perlunicode/Noncharacter code points>. | |
| =back | |
| =head3 L<perluniintro> | |
| =over 4 | |
| =item * | |
| Advice for how to make sure your strings and regular expression patterns are | |
| interpreted as Unicode has been updated. | |
| =back | |
| =head3 L<perlvar> | |
| =over 4 | |
| =item * | |
| C<$]> is no longer listed as being deprecated. Instead, discussion has | |
| been added on the advantages and disadvantages of using it versus | |
| C<$^V>. C<$OLD_PERL_VERSION> was re-added to the documentation as the long | |
| form of C<$]>. | |
| =item * | |
| C<${^ENCODING}> is now marked as deprecated. | |
| =item * | |
| The entry for C<%^H> has been clarified to indicate it can only handle | |
| simple values. | |
| =back | |
| =head3 L<perlvms> | |
| =over 4 | |
| =item * | |
| Out-of-date and/or incorrect material has been removed. | |
| =item * | |
| Updated documentation on environment and shell interaction in VMS. | |
| =back | |
| =head3 L<perlxs> | |
| =over 4 | |
| =item * | |
| Added a discussion of locale issues in XS code. | |
| =back | |
| =head1 Diagnostics | |
| The following additions or changes have been made to diagnostic output, | |
| including warnings and fatal error messages. For the complete list of | |
| diagnostic messages, see L<perldiag>. | |
| =head2 New Diagnostics | |
| =head3 New Errors | |
| =over 4 | |
| =item * | |
| L<Bad symbol for scalar|perldiag/"Bad symbol for scalar"> | |
| (P) An internal request asked to add a scalar entry to something that | |
| wasn't a symbol table entry. | |
| =item * | |
| L<Can't use a hash as a reference|perldiag/"Can't use a hash as a reference"> | |
| (F) You tried to use a hash as a reference, as in | |
| C<< %foo->{"bar"} >> or C<< %$ref->{"hello"} >>. Versions of perl E<lt>= 5.6.1 | |
| used to allow this syntax, but shouldn't have. | |
| =item * | |
| L<Can't use an array as a reference|perldiag/"Can't use an array as a reference"> | |
| (F) You tried to use an array as a reference, as in | |
| C<< @foo->[23] >> or C<< @$ref->[99] >>. Versions of perl E<lt>= 5.6.1 used to | |
| allow this syntax, but shouldn't have. | |
| =item * | |
| L<Can't use 'defined(@array)' (Maybe you should just omit the defined()?)|perldiag/"Can't use 'defined(@array)' (Maybe you should just omit the defined()?)"> | |
| (F) C<defined()> is not useful on arrays because it | |
| checks for an undefined I<scalar> value. If you want to see if the | |
| array is empty, just use S<C<if (@array) { # not empty }>> for example. | |
| =item * | |
| L<Can't use 'defined(%hash)' (Maybe you should just omit the defined()?)|perldiag/"Can't use 'defined(%hash)' (Maybe you should just omit the defined()?)"> | |
| (F) C<defined()> is not usually right on hashes. | |
| Although S<C<defined %hash>> is false on a plain not-yet-used hash, it | |
| becomes true in several non-obvious circumstances, including iterators, | |
| weak references, stash names, even remaining true after S<C<undef %hash>>. | |
| These things make S<C<defined %hash>> fairly useless in practice, so it now | |
| generates a fatal error. | |
| If a check for non-empty is what you wanted then just put it in boolean | |
| context (see L<perldata/Scalar values>): | |
| if (%hash) { | |
| # not empty | |
| } | |
| If you had S<C<defined %Foo::Bar::QUUX>> to check whether such a package | |
| variable exists then that's never really been reliable, and isn't | |
| a good way to enquire about the features of a package, or whether | |
| it's loaded, etc. | |
| =item * | |
| L<Cannot chr %f|perldiag/"Cannot chr %f"> | |
| (F) You passed an invalid number (like an infinity or not-a-number) to | |
| C<chr>. | |
| =item * | |
| L<Cannot compress %f in pack|perldiag/"Cannot compress %f in pack"> | |
| (F) You tried converting an infinity or not-a-number to an unsigned | |
| character, which makes no sense. | |
| =item * | |
| L<Cannot pack %f with '%c'|perldiag/"Cannot pack %f with '%c'"> | |
| (F) You tried converting an infinity or not-a-number to a character, | |
| which makes no sense. | |
| =item * | |
| L<Cannot print %f with '%c'|perldiag/"Cannot printf %f with '%c'"> | |
| (F) You tried printing an infinity or not-a-number as a character (C<%c>), | |
| which makes no sense. Maybe you meant C<'%s'>, or just stringifying it? | |
| =item * | |
| L<charnames alias definitions may not contain a sequence of multiple spaces|perldiag/"charnames alias definitions may not contain a sequence of multiple spaces"> | |
| (F) You defined a character name which had multiple space | |
| characters in a row. Change them to single spaces. Usually these | |
| names are defined in the C<:alias> import argument to C<use charnames>, but | |
| they could be defined by a translator installed into C<$^H{charnames}>. | |
| See L<charnames/CUSTOM ALIASES>. | |
| =item * | |
| L<charnames alias definitions may not contain trailing white-space|perldiag/"charnames alias definitions may not contain trailing white-space"> | |
| (F) You defined a character name which ended in a space | |
| character. Remove the trailing space(s). Usually these names are | |
| defined in the C<:alias> import argument to C<use charnames>, but they | |
| could be defined by a translator installed into C<$^H{charnames}>. | |
| See L<charnames/CUSTOM ALIASES>. | |
| =item * | |
| L<:const is not permitted on named subroutines|perldiag/":const is not permitted on named subroutines"> | |
| (F) The C<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 * | |
| L<Hexadecimal float: internal error|perldiag/"Hexadecimal float: internal error"> | |
| (F) Something went horribly bad in hexadecimal float handling. | |
| =item * | |
| L<Hexadecimal float: unsupported long double format|perldiag/"Hexadecimal float: unsupported long double format"> | |
| (F) You have configured Perl to use long doubles but | |
| the internals of the long double format are unknown, | |
| therefore the hexadecimal float output is impossible. | |
| =item * | |
| L<Illegal suidscript|perldiag/"Illegal suidscript"> | |
| (F) The script run under suidperl was somehow illegal. | |
| =item * | |
| L<In '(?...)', the '(' and '?' must be adjacent in regex; marked by S<<-- HERE> in mE<sol>%sE<sol>|perldiag/"In '(?...)', the '(' and '?' must be adjacent in regex; marked by <-- HERE in m/%s/"> | |
| (F) The two-character sequence C<"(?"> in | |
| this context in a regular expression pattern should be an | |
| indivisible token, with nothing intervening between the C<"("> | |
| and the C<"?">, but you separated them. | |
| =item * | |
| L<In '(*VERB...)', the '(' and '*' must be adjacent in regex; marked by S<<-- HERE> in mE<sol>%sE<sol>|perldiag/"In '(*VERB...)', the '(' and '*' must be adjacent in regex; marked by <-- HERE in m/%s/"> | |
| (F) The two-character sequence C<"(*"> in | |
| this context in a regular expression pattern should be an | |
| indivisible token, with nothing intervening between the C<"("> | |
| and the C<"*">, but you separated them. | |
| =item * | |
| L<Invalid quantifier in {,} in regex; marked by <-- HERE in mE<sol>%sE<sol>|perldiag/"Invalid quantifier in {,} in regex; marked by <-- 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<perlre>. | |
| =item * | |
| L<'%s' is an unknown bound type in regex|perldiag/"'%s' is an unknown bound type in regex; marked by <-- 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<perlrebackslash/\b{}, \b, \B{}, \B>. | |
| =item * | |
| L<Missing or undefined argument to require|perldiag/Missing or undefined argument to require> | |
| (F) You tried to call C<require> with no argument or with an undefined | |
| value as an argument. C<require> expects either a package name or a | |
| file-specification as an argument. See L<perlfunc/require>. | |
| Formerly, C<require> with no argument or C<undef> warned about a Null filename. | |
| =back | |
| =head3 New Warnings | |
| =over 4 | |
| =item * | |
| L<\C is deprecated in regex|perldiag/"\C is deprecated in regex; marked by <-- HERE in m/%s/"> | |
| (D deprecated) The C<< /\C/ >> character class was deprecated in v5.20, and | |
| now emits a warning. It is intended that it will become an error in v5.24. | |
| This character class matches a single byte even if it appears within a | |
| multi-byte character, breaks encapsulation, and can corrupt UTF-8 | |
| strings. | |
| =item * | |
| L<"%s" is more clearly written simply as "%s" in regex; marked by E<lt>-- HERE in mE<sol>%sE<sol>|perldiag/"%s" is more clearly written simply as "%s" in regex; marked by <-- HERE in mE<sol>%sE<sol>> | |
| (W regexp) (only under C<S<use re 'strict'>> 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 * | |
| L<Argument "%s" treated as 0 in increment (++)|perldiag/"Argument "%s" treated | |
| as 0 in increment (++)"> | |
| (W numeric) The indicated string was fed as an argument to the C<++> operator | |
| which expects either a number or a string matching C</^[a-zA-Z]*[0-9]*\z/>. | |
| See L<perlop/Auto-increment and Auto-decrement> for details. | |
| =item * | |
| L<Both or neither range ends should be Unicode in regex; marked by E<lt>-- HERE in mE<sol>%sE<sol>|perldiag/"Both or neither range ends should be Unicode in regex; marked by <-- HERE in m/%s/"> | |
| (W regexp) (only under C<S<use re 'strict'>> 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 * | |
| L<Can't do %s("%s") on non-UTF-8 locale; resolved to "%s".|perldiag/Can't do %s("%s") on non-UTF-8 locale; resolved to "%s".> | |
| (W locale) You are 1) running under "C<use locale>"; 2) the current | |
| locale is not a UTF-8 one; 3) you tried to do the designated case-change | |
| operation on the specified Unicode character; and 4) the result of this | |
| operation would mix Unicode and locale rules, which likely conflict. | |
| The warnings category C<locale> is new. | |
| =item * | |
| L<:const is experimental|perldiag/":const is experimental"> | |
| (S experimental::const_attr) The C<const> attribute is experimental. | |
| If you want to use the feature, disable the warning with C<no warnings | |
| 'experimental::const_attr'>, but know that in doing so you are taking | |
| the risk that your code may break in a future Perl version. | |
| =item * | |
| L<gmtime(%f) failed|perldiag/"gmtime(%f) failed"> | |
| (W overflow) You called C<gmtime> with a number that it could not handle: | |
| too large, too small, or NaN. The returned value is C<undef>. | |
| =item * | |
| L<Hexadecimal float: exponent overflow|perldiag/"Hexadecimal float: exponent overflow"> | |
| (W overflow) The hexadecimal floating point has larger exponent | |
| than the floating point supports. | |
| =item * | |
| L<Hexadecimal float: exponent underflow|perldiag/"Hexadecimal float: exponent underflow"> | |
| (W overflow) The hexadecimal floating point has smaller exponent | |
| than the floating point supports. | |
| =item * | |
| L<Hexadecimal float: mantissa overflow|perldiag/"Hexadecimal float: mantissa overflow"> | |
| (W overflow) The hexadecimal floating point literal had more bits in | |
| the mantissa (the part between the C<0x> and the exponent, also known as | |
| the fraction or the significand) than the floating point supports. | |
| =item * | |
| L<Hexadecimal float: precision loss|perldiag/"Hexadecimal float: precision loss"> | |
| (W overflow) The hexadecimal floating point had internally more | |
| digits than could be output. This can be caused by unsupported | |
| long double formats, or by 64-bit integers not being available | |
| (needed to retrieve the digits under some configurations). | |
| =item * | |
| L<Locale '%s' may not work well.%s|perldiag/Locale '%s' may not work well.%s> | |
| (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. | |
| The warnings category C<locale> is new. | |
| =item * | |
| L<localtime(%f) failed|perldiag/"localtime(%f) failed"> | |
| (W overflow) You called C<localtime> with a number that it could not handle: | |
| too large, too small, or NaN. The returned value is C<undef>. | |
| =item * | |
| L<Negative repeat count does nothing|perldiag/"Negative repeat count does nothing"> | |
| (W numeric) You tried to execute the | |
| L<C<x>|perlop/Multiplicative Operators> repetition operator fewer than 0 | |
| times, which doesn't make sense. | |
| =item * | |
| L<NO-BREAK SPACE in a charnames alias definition is deprecated|perldiag/"NO-BREAK SPACE in a charnames alias definition is deprecated"> | |
| (D deprecated) You defined a character name which contained a no-break | |
| space character. Change it to a regular space. Usually these names are | |
| defined in the C<:alias> import argument to C<use charnames>, but they | |
| could be defined by a translator installed into C<$^H{charnames}>. See | |
| L<charnames/CUSTOM ALIASES>. | |
| =item * | |
| L<Non-finite repeat count does nothing|perldiag/"Non-finite repeat count does nothing"> | |
| (W numeric) You tried to execute the | |
| L<C<x>|perlop/Multiplicative Operators> repetition operator C<Inf> (or | |
| C<-Inf>) or NaN times, which doesn't make sense. | |
| =item * | |
| L<PerlIO layer ':win32' is experimental|perldiag/"PerlIO layer ':win32' is experimental"> | |
| (S experimental::win32_perlio) The C<:win32> PerlIO layer is | |
| experimental. If you want to take the risk of using this layer, | |
| simply disable this warning: | |
| no warnings "experimental::win32_perlio"; | |
| =item * | |
| L<Ranges of ASCII printables should be some subset of "0-9", "A-Z", or "a-z" in regex; marked by E<lt>-- HERE in mE<sol>%sE<sol>|perldiag/"Ranges of ASCII printables should be some subset of "0-9", "A-Z", or "a-z" in regex; marked by <-- HERE in mE<sol>%sE<sol>"> | |
| (W regexp) (only under C<S<use re 'strict'>> 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<C<\N{...}>|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 a 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 * | |
| L<Ranges of digits should be from the same group in regex; marked by E<lt>-- HERE in mE<sol>%sE<sol>|perldiag/"Ranges of digits should be from the same group in regex; marked by <-- HERE in m/%s/"> | |
| (W regexp) (only under C<S<use re 'strict'>> 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 * | |
| L<Redundant argument in %s|perldiag/Redundant argument in %s> | |
| (W redundant) You called a function with more arguments than were | |
| needed, as indicated by information within other arguments you supplied | |
| (I<e.g>. a printf format). Currently only emitted when a printf-type format | |
| required fewer arguments than were supplied, but might be used in the | |
| future for I<e.g.> L<perlfunc/pack>. | |
| The warnings category C<< redundant >> is new. See also | |
| L<[GH #13534]|https://github.com/Perl/perl5/issues/13534>. | |
| =item * | |
| L<Replacement list is longer than search list|perldiag/Replacement list is longer than search list> | |
| This is not a new diagnostic, but in earlier releases was accidentally | |
| not displayed if the transliteration contained wide characters. This is | |
| now fixed, so that you may see this diagnostic in places where you | |
| previously didn't (but should have). | |
| =item * | |
| L<Use of \b{} for non-UTF-8 locale is wrong. Assuming a UTF-8 locale|perldiag/"Use of \b{} for non-UTF-8 locale is wrong. Assuming a UTF-8 locale"> | |
| (W locale) You are matching a regular expression using locale rules, | |
| and a Unicode boundary is being matched, but the locale is not a Unicode | |
| one. This doesn't make sense. Perl will continue, assuming a Unicode | |
| (UTF-8) locale, but the results could well be wrong except if the locale | |
| happens to be ISO-8859-1 (Latin1) where this message is spurious and can | |
| be ignored. | |
| The warnings category C<locale> is new. | |
| =item * | |
| L<< Using E<sol>u for '%s' instead of E<sol>%s in regex; marked by E<lt>-- HERE in mE<sol>%sE<sol>|perldiag/"Using E<sol>u for '%s' instead of E<sol>%s in regex; marked by <-- HERE in mE<sol>%sE<sol>" >> | |
| (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</a> | |
| or C</aa> are in effect. These two modifiers indicate an ASCII | |
| interpretation, and this doesn't make sense for a Unicode definition. | |
| The generated regular expression will compile so that the boundary uses | |
| all of Unicode. No other portion of the regular expression is affected. | |
| =item * | |
| L<The bitwise feature is experimental|perldiag/"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 * | |
| L<Unescaped left brace in regex is deprecated, passed through in regex; marked by <-- HERE in mE<sol>%sE<sol>|perldiag/"Unescaped left brace in regex is deprecated, passed through in regex; marked by <-- 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 future | |
| version of Perl (tentatively v5.26) will consider this to be a syntax error. If | |
| the pattern delimiters are also braces, any matching right brace | |
| (C<"}">) should also be escaped to avoid confusing the parser, for | |
| example, | |
| qr{abc\{def\}ghi} | |
| =item * | |
| L<Use of literal non-graphic characters in variable names is deprecated|perldiag/"Use of literal non-graphic characters in variable names is deprecated"> | |
| (D deprecated) Using literal non-graphic (including control) | |
| characters in the source to refer to the I<^FOO> variables, like C<$^X> and | |
| C<${^GLOBAL_PHASE}> is now deprecated. | |
| =item * | |
| L<Useless use of attribute "const"|perldiag/Useless use of attribute "const"> | |
| (W misc) The C<const> attribute has no effect except | |
| on anonymous closure prototypes. You applied it to | |
| a subroutine via L<attributes.pm|attributes>. This is only useful | |
| inside an attribute handler for an anonymous subroutine. | |
| =item * | |
| L<Useless use of E<sol>d modifier in transliteration operator|perldiag/"Useless use of /d modifier in transliteration operator"> | |
| This is not a new diagnostic, but in earlier releases was accidentally | |
| not displayed if the transliteration contained wide characters. This is | |
| now fixed, so that you may see this diagnostic in places where you | |
| previously didn't (but should have). | |
| =item * | |
| L<E<quot>use re 'strict'E<quot> is experimental|perldiag/"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; there are also proposals | |
| to change how to enable strict checking instead of using this subpragma. | |
| 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 * | |
| L<Warning: unable to close filehandle properly: %s|perldiag/"Warning: unable to close filehandle properly: %s"> | |
| L<Warning: unable to close filehandle %s properly: %s|perldiag/"Warning: unable to close filehandle %s properly: %s"> | |
| (S io) Previously, perl silently ignored any errors when doing an implicit | |
| close of a filehandle, I<i.e.> where the reference count of the filehandle | |
| reached zero and the user's code hadn't already called C<close()>; I<e.g.> | |
| { | |
| open my $fh, '>', $file or die "open: '$file': $!\n"; | |
| print $fh, $data or die; | |
| } # implicit close here | |
| In a situation such as disk full, due to buffering, the error may only be | |
| detected during the final close, so not checking the result of the close is | |
| dangerous. | |
| So perl now warns in such situations. | |
| =item * | |
| L<Wide character (U+%X) in %s|perldiag/"Wide character (U+%X) in %s"> | |
| (W locale) While in a single-byte locale (I<i.e.>, 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). | |
| The warnings category C<locale> is new. | |
| =back | |
| =head2 Changes to Existing Diagnostics | |
| =over 4 | |
| =item * | |
| <> should be quotes | |
| This warning has been changed to | |
| L<< <> at require-statement should be quotes|perldiag/"<> at require-statement should be quotes" >> | |
| to make the issue more identifiable. | |
| =item * | |
| L<Argument "%s" isn't numeric%s|perldiag/"Argument "%s" isn't numeric%s"> | |
| The L<perldiag> entry for this warning has added this clarifying note: | |
| Note that for the Inf and NaN (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 * | |
| L<Global symbol "%s" requires explicit package name|perldiag/"Global symbol "%s" requires explicit package name (did you forget to declare "my %s"?)"> | |
| This message has had '(did you forget to declare "my %s"?)' appended to it, to | |
| make it more helpful to new Perl programmers. | |
| L<[GH #13732]|https://github.com/Perl/perl5/issues/13732> | |
| =item * | |
| '"my" variable &foo::bar can't be in a package' has been reworded to say | |
| 'subroutine' instead of 'variable'. | |
| =item * | |
| L<<< \N{} in character class restricted to one character in regex; marked by | |
| S<< <-- HERE >> in mE<sol>%sE<sol>|perldiag/"\N{} in inverted character | |
| class or as a range end-point is restricted to one character in regex; | |
| marked by <-- HERE in m/%s/" >>> | |
| This message has had I<character class> changed to I<inverted character | |
| class or as a range end-point is> to reflect improvements in | |
| C<qr/[\N{named sequence}]/> (see under L</Selected Bug Fixes>). | |
| =item * | |
| L<panic: frexp|perldiag/"panic: frexp: %f"> | |
| This message has had ': C<%f>' appended to it, to show what the offending | |
| floating point number is. | |
| =item * | |
| I<Possible precedence problem on bitwise %c operator> reworded as | |
| L<Possible precedence problem on bitwise %s operator|perldiag/"Possible precedence problem on bitwise %s operator">. | |
| =item * | |
| L<Unsuccessful %s on filename containing newline|perldiag/"Unsuccessful %s on filename containing newline"> | |
| This warning is now only produced when the newline is at the end of | |
| the filename. | |
| =item * | |
| "Variable C<%s> will not stay shared" has been changed to say "Subroutine" | |
| when it is actually a lexical sub that will not stay shared. | |
| =item * | |
| L<Variable length lookbehind not implemented in regex mE<sol>%sE<sol>|perldiag/"Variable length lookbehind not implemented in regex m/%s/"> | |
| The L<perldiag> entry for this warning has had information about Unicode | |
| behavior added. | |
| =back | |
| =head2 Diagnostic Removals | |
| =over | |
| =item * | |
| "Ambiguous use of -foo resolved as -&foo()" | |
| There is actually no ambiguity here, and this impedes the use of negated | |
| constants; I<e.g.>, C<-Inf>. | |
| =item * | |
| "Constant is not a FOO reference" | |
| Compile-time checking of constant dereferencing (I<e.g.>, C<< my_constant->() >>) | |
| has been removed, since it was not taking overloading into account. | |
| L<[GH #9891]|https://github.com/Perl/perl5/issues/9891> | |
| L<[GH #14044]|https://github.com/Perl/perl5/issues/14044> | |
| =back | |
| =head1 Utility Changes | |
| =head2 F<find2perl>, F<s2p> and F<a2p> removal | |
| =over 4 | |
| =item * | |
| The F<x2p/> directory has been removed from the Perl core. | |
| This removes find2perl, s2p and a2p. They have all been released to CPAN as | |
| separate distributions (C<App::find2perl>, C<App::s2p>, C<App::a2p>). | |
| =back | |
| =head2 L<h2ph> | |
| =over 4 | |
| =item * | |
| F<h2ph> now handles hexadecimal constants in the compiler's predefined | |
| macro definitions, as visible in C<$Config{cppsymbols}>. | |
| L<[GH #14491]|https://github.com/Perl/perl5/issues/14491>. | |
| =back | |
| =head2 L<encguess> | |
| =over 4 | |
| =item * | |
| No longer depends on non-core modules. | |
| =back | |
| =head1 Configuration and Compilation | |
| =over 4 | |
| =item * | |
| F<Configure> now checks for C<lrintl()>, C<lroundl()>, C<llrintl()>, and | |
| C<llroundl()>. | |
| =item * | |
| F<Configure> with C<-Dmksymlinks> should now be faster. | |
| L<[GH #13890]|https://github.com/Perl/perl5/issues/13890>. | |
| =item * | |
| The C<pthreads> and C<cl> libraries will be linked by default if present. | |
| This allows XS modules that require threading to work on non-threaded | |
| perls. Note that you must still pass C<-Dusethreads> if you want a | |
| threaded perl. | |
| =item * | |
| To get more precision and range for floating point numbers one can now | |
| use the GCC quadmath library which implements the quadruple precision | |
| floating point numbers on x86 and IA-64 platforms. See F<INSTALL> for | |
| details. | |
| =item * | |
| MurmurHash64A and MurmurHash64B can now be configured as the internal hash | |
| function. | |
| =item * | |
| C<make test.valgrind> now supports parallel testing. | |
| For example: | |
| TEST_JOBS=9 make test.valgrind | |
| See L<perlhacktips/valgrind> for more information. | |
| L<[GH #13658]|https://github.com/Perl/perl5/issues/13658> | |
| =item * | |
| The MAD (Misc Attribute Decoration) build option has been removed | |
| This was an unmaintained attempt at preserving | |
| the Perl parse tree more faithfully so that automatic conversion of | |
| Perl 5 to Perl 6 would have been easier. | |
| This build-time configuration option had been unmaintained for years, | |
| and had probably seriously diverged on both Perl 5 and Perl 6 sides. | |
| =item * | |
| A new compilation flag, C<< -DPERL_OP_PARENT >> is available. For details, | |
| see the discussion below at L<< /Internal Changes >>. | |
| =item * | |
| Pathtools no longer tries to load XS on miniperl. This speeds up building perl | |
| slightly. | |
| =back | |
| =head1 Testing | |
| =over 4 | |
| =item * | |
| F<t/porting/re_context.t> has been added to test that L<utf8> and its | |
| dependencies only use the subset of the C<$1..$n> capture vars that | |
| C<Perl_save_re_context()> is hard-coded to localize, because that function | |
| has no efficient way of determining at runtime what vars to localize. | |
| =item * | |
| Tests for performance issues have been added in the file F<t/perf/taint.t>. | |
| =item * | |
| Some regular expression tests are written in such a way that they will | |
| run very slowly if certain optimizations break. These tests have been | |
| moved into new files, F<< t/re/speed.t >> and F<< t/re/speed_thr.t >>, | |
| and are run with a C<< watchdog() >>. | |
| =item * | |
| C<< test.pl >> now allows C<< plan skip_all => $reason >>, to make it | |
| more compatible with C<< Test::More >>. | |
| =item * | |
| A new test script, F<op/infnan.t>, has been added to test if infinity and NaN are | |
| working correctly. See L</Infinity and NaN (not-a-number) handling improved>. | |
| =back | |
| =head1 Platform Support | |
| =head2 Regained Platforms | |
| =over 4 | |
| =item IRIX and Tru64 platforms are working again. | |
| Some C<make test> failures remain: | |
| L<[GH #14557]|https://github.com/Perl/perl5/issues/14557> | |
| and L<[GH #14727]|https://github.com/Perl/perl5/issues/14727> | |
| for IRIX; L<[GH #14629]|https://github.com/Perl/perl5/issues/14629>, | |
| L<[cpan #99605]|https://rt.cpan.org/Public/Bug/Display.html?id=99605>, and | |
| L<[cpan #104836]|https://rt.cpan.org/Ticket/Display.html?id=104836> for Tru64. | |
| =item z/OS running EBCDIC Code Page 1047 | |
| Core perl now works on this EBCDIC platform. Earlier perls also worked, but, | |
| even though support wasn't officially withdrawn, recent perls would not compile | |
| and run well. Perl 5.20 would work, but had many bugs which have now been | |
| fixed. Many CPAN modules that ship with Perl still fail tests, including | |
| C<Pod::Simple>. However the version of C<Pod::Simple> currently on CPAN should work; | |
| it was fixed too late to include in Perl 5.22. Work is under way to fix many | |
| of the still-broken CPAN modules, which likely will be installed on CPAN when | |
| completed, so that you may not have to wait until Perl 5.24 to get a working | |
| version. | |
| =back | |
| =head2 Discontinued Platforms | |
| =over 4 | |
| =item NeXTSTEP/OPENSTEP | |
| NeXTSTEP was a proprietary operating system bundled with NeXT's | |
| workstations in the early to mid 90s; OPENSTEP was an API specification | |
| that provided a NeXTSTEP-like environment on a non-NeXTSTEP system. Both | |
| are now long dead, so support for building Perl on them has been removed. | |
| =back | |
| =head2 Platform-Specific Notes | |
| =over 4 | |
| =item EBCDIC | |
| Special handling is required of the perl interpreter on EBCDIC platforms | |
| to get C<qr/[i-j]/> to match only C<"i"> and C<"j">, since there are 7 | |
| characters between the | |
| code points for C<"i"> and C<"j">. This special handling had only been | |
| invoked when both ends of the range are literals. Now it is also | |
| invoked if any of the C<\N{...}> forms for specifying a character by | |
| name or Unicode code point is used instead of a literal. See | |
| L<perlrecharclass/Character Ranges>. | |
| =item HP-UX | |
| The archname now distinguishes use64bitint from use64bitall. | |
| =item Android | |
| Build support has been improved for cross-compiling in general and for | |
| Android in particular. | |
| =item VMS | |
| =over 4 | |
| =item * | |
| When spawning a subprocess without waiting, the return value is now | |
| the correct PID. | |
| =item * | |
| Fix a prototype so linking doesn't fail under the VMS C++ compiler. | |
| =item * | |
| C<finite>, C<finitel>, and C<isfinite> detection has been added to | |
| C<configure.com>, environment handling has had some minor changes, and | |
| a fix for legacy feature checking status. | |
| =back | |
| =item Win32 | |
| =over 4 | |
| =item * | |
| F<miniperl.exe> is now built with C<-fno-strict-aliasing>, allowing 64-bit | |
| builds to complete on GCC 4.8. | |
| L<[GH #14556]|https://github.com/Perl/perl5/issues/14556> | |
| =item * | |
| C<nmake minitest> now works on Win32. Due to dependency issues you | |
| need to build C<nmake test-prep> first, and a small number of the | |
| tests fail. | |
| L<[GH #14318]|https://github.com/Perl/perl5/issues/14318> | |
| =item * | |
| Perl can now be built in C++ mode on Windows by setting the makefile macro | |
| C<USE_CPLUSPLUS> to the value "define". | |
| =item * | |
| The list form of piped open has been implemented for Win32. Note: unlike | |
| C<system LIST> this does not fall back to the shell. | |
| L<[GH #13574]|https://github.com/Perl/perl5/issues/13574> | |
| =item * | |
| New C<DebugSymbols> and C<DebugFull> configuration options added to | |
| Windows makefiles. | |
| =item * | |
| Previously, compiling XS modules (including CPAN ones) using Visual C++ for | |
| Win64 resulted in around a dozen warnings per file from F<hv_func.h>. These | |
| warnings have been silenced. | |
| =item * | |
| Support for building without PerlIO has been removed from the Windows | |
| makefiles. Non-PerlIO builds were all but deprecated in Perl 5.18.0 and are | |
| already not supported by F<Configure> on POSIX systems. | |
| =item * | |
| Between 2 and 6 milliseconds and seven I/O calls have been saved per attempt | |
| to open a perl module for each path in C<@INC>. | |
| =item * | |
| Intel C builds are now always built with C99 mode on. | |
| =item * | |
| C<%I64d> is now being used instead of C<%lld> for MinGW. | |
| =item * | |
| In the experimental C<:win32> layer, a crash in C<open> was fixed. Also | |
| opening F</dev/null> (which works under Win32 Perl's default C<:unix> | |
| layer) was implemented for C<:win32>. | |
| L<[GH #13968]|https://github.com/Perl/perl5/issues/13968> | |
| =item * | |
| A new makefile option, C<USE_LONG_DOUBLE>, has been added to the Windows | |
| dmake makefile for gcc builds only. Set this to "define" if you want perl to | |
| use long doubles to give more accuracy and range for floating point numbers. | |
| =back | |
| =item OpenBSD | |
| On OpenBSD, Perl will now default to using the system C<malloc> due to the | |
| security features it provides. Perl's own malloc wrapper has been in use | |
| since v5.14 due to performance reasons, but the OpenBSD project believes | |
| the tradeoff is worth it and would prefer that users who need the speed | |
| specifically ask for it. | |
| L<[GH #13888]|https://github.com/Perl/perl5/issues/13888>. | |
| =item Solaris | |
| =over 4 | |
| =item * | |
| We now look for the Sun Studio compiler in both F</opt/solstudio*> and | |
| F</opt/solarisstudio*>. | |
| =item * | |
| Builds on Solaris 10 with C<-Dusedtrace> would fail early since make | |
| didn't follow implied dependencies to build C<perldtrace.h>. Added an | |
| explicit dependency to C<depend>. | |
| L<[GH #13334]|https://github.com/Perl/perl5/issues/13334> | |
| =item * | |
| C99 options have been cleaned up; hints look for C<solstudio> | |
| as well as C<SUNWspro>; and support for native C<setenv> has been added. | |
| =back | |
| =back | |
| =head1 Internal Changes | |
| =over 4 | |
| =item * | |
| Experimental support has been added to allow ops in the optree to locate | |
| their parent, if any. This is enabled by the non-default build option | |
| C<-DPERL_OP_PARENT>. It is envisaged that this will eventually become | |
| enabled by default, so XS code which directly accesses the C<op_sibling> | |
| field of ops should be updated to be future-proofed. | |
| On C<PERL_OP_PARENT> builds, the C<op_sibling> field has been renamed | |
| C<op_sibparent> and a new flag, C<op_moresib>, added. On the last op in a | |
| sibling chain, C<op_moresib> is false and C<op_sibparent> points to the | |
| parent (if any) rather than being C<NULL>. | |
| To make existing code work transparently whether using C<PERL_OP_PARENT> | |
| or not, a number of new macros and functions have been added that should | |
| be used, rather than directly manipulating C<op_sibling>. | |
| For the case of just reading C<op_sibling> to determine the next sibling, | |
| two new macros have been added. A simple scan through a sibling chain | |
| like this: | |
| for (; kid->op_sibling; kid = kid->op_sibling) { ... } | |
| should now be written as: | |
| for (; OpHAS_SIBLING(kid); kid = OpSIBLING(kid)) { ... } | |
| For altering optrees, a general-purpose function C<op_sibling_splice()> | |
| has been added, which allows for manipulation of a chain of sibling ops. | |
| By analogy with the Perl function C<splice()>, it allows you to cut out | |
| zero or more ops from a sibling chain and replace them with zero or more | |
| new ops. It transparently handles all the updating of sibling, parent, | |
| op_last pointers etc. | |
| If you need to manipulate ops at a lower level, then three new macros, | |
| C<OpMORESIB_set>, C<OpLASTSIB_set> and C<OpMAYBESIB_set> are intended to | |
| be a low-level portable way to set C<op_sibling> / C<op_sibparent> while | |
| also updating C<op_moresib>. The first sets the sibling pointer to a new | |
| sibling, the second makes the op the last sibling, and the third | |
| conditionally does the first or second action. Note that unlike | |
| C<op_sibling_splice()> these macros won't maintain consistency in the | |
| parent at the same time (I<e.g.> by updating C<op_first> and C<op_last> where | |
| appropriate). | |
| A C-level C<Perl_op_parent()> function and a Perl-level C<B::OP::parent()> | |
| method have been added. The C function only exists under | |
| C<PERL_OP_PARENT> builds (using it is build-time error on vanilla | |
| perls). C<B::OP::parent()> exists always, but on a vanilla build it | |
| always returns C<NULL>. Under C<PERL_OP_PARENT>, they return the parent | |
| of the current op, if any. The variable C<$B::OP::does_parent> allows you | |
| to determine whether C<B> supports retrieving an op's parent. | |
| C<PERL_OP_PARENT> was introduced in 5.21.2, but the interface was | |
| changed considerably in 5.21.11. If you updated your code before the | |
| 5.21.11 changes, it may require further revision. The main changes after | |
| 5.21.2 were: | |
| =over 4 | |
| =item * | |
| The C<OP_SIBLING> and C<OP_HAS_SIBLING> macros have been renamed | |
| C<OpSIBLING> and C<OpHAS_SIBLING> for consistency with other | |
| op-manipulating macros. | |
| =item * | |
| The C<op_lastsib> field has been renamed C<op_moresib>, and its meaning | |
| inverted. | |
| =item * | |
| The macro C<OpSIBLING_set> has been removed, and has been superseded by | |
| C<OpMORESIB_set> I<et al>. | |
| =item * | |
| The C<op_sibling_splice()> function now accepts a null C<parent> argument | |
| where the splicing doesn't affect the first or last ops in the sibling | |
| chain | |
| =back | |
| =item * | |
| Macros have been created to allow XS code to better manipulate the POSIX locale | |
| category C<LC_NUMERIC>. See L<perlapi/Locale-related functions and macros>. | |
| =item * | |
| The previous C<atoi> I<et al> replacement function, C<grok_atou>, has now been | |
| superseded by C<grok_atoUV>. See L<perlclib> for details. | |
| =item * | |
| A new function, C<Perl_sv_get_backrefs()>, has been added which allows you | |
| retrieve the weak references, if any, which point at an SV. | |
| =item * | |
| The C<screaminstr()> function has been removed. Although marked as | |
| public API, it was undocumented and had no usage in CPAN modules. Calling | |
| it has been fatal since 5.17.0. | |
| =item * | |
| The C<newDEFSVOP()>, C<block_start()>, C<block_end()> and C<intro_my()> | |
| functions have been added to the API. | |
| =item * | |
| The internal C<convert> function in F<op.c> has been renamed | |
| C<op_convert_list> and added to the API. | |
| =item * | |
| The C<sv_magic()> function no longer forbids "ext" magic on read-only | |
| values. After all, perl can't know whether the custom magic will modify | |
| the SV or not. | |
| L<[GH #14202]|https://github.com/Perl/perl5/issues/14202>. | |
| =item * | |
| Accessing L<perlapi/CvPADLIST> on an XSUB is now forbidden. | |
| The C<CvPADLIST> field has been reused for a different internal purpose | |
| for XSUBs. So in particular, you can no longer rely on it being NULL as a | |
| test of whether a CV is an XSUB. Use C<CvISXSUB()> instead. | |
| =item * | |
| SVs of type C<SVt_NV> are now sometimes bodiless when the build | |
| configuration and platform allow it: specifically, when C<< sizeof(NV) <= | |
| sizeof(IV) >>. "Bodiless" means that the NV value is stored directly in | |
| the head of an SV, without requiring a separate body to be allocated. This | |
| trick has already been used for IVs since 5.9.2 (though in the case of | |
| IVs, it is always used, regardless of platform and build configuration). | |
| =item * | |
| The C<$DB::single>, C<$DB::signal> and C<$DB::trace> variables now have set- and | |
| get-magic that stores their values as IVs, and those IVs are used when | |
| testing their values in C<pp_dbstate()>. This prevents perl from | |
| recursing infinitely if an overloaded object is assigned to any of those | |
| variables. | |
| L<[GH #14013]|https://github.com/Perl/perl5/issues/14013>. | |
| =item * | |
| C<Perl_tmps_grow()>, which is marked as public API but is undocumented, has | |
| been removed from the public API. This change does not affect XS code that | |
| uses the C<EXTEND_MORTAL> macro to pre-extend the mortal stack. | |
| =item * | |
| Perl's internals no longer sets or uses the C<SVs_PADMY> flag. | |
| C<SvPADMY()> now returns a true value for anything not marked C<PADTMP> | |
| and C<SVs_PADMY> is now defined as 0. | |
| =item * | |
| The macros C<SETsv> and C<SETsvUN> have been removed. They were no longer used | |
| in the core since commit 6f1401dc2a five years ago, and have not been | |
| found present on CPAN. | |
| =item * | |
| The C<< SvFAKE >> bit (unused on HVs) got informally reserved by | |
| David Mitchell for future work on vtables. | |
| =item * | |
| The C<sv_catpvn_flags()> function accepts C<SV_CATBYTES> and C<SV_CATUTF8> | |
| flags, which specify whether the appended string is bytes or UTF-8, | |
| respectively. (These flags have in fact been present since 5.16.0, but | |
| were formerly not regarded as part of the API.) | |
| =item * | |
| A new opcode class, C<< METHOP >>, has been introduced. It holds | |
| information used at runtime to improve the performance | |
| of class/object method calls. | |
| C<< OP_METHOD >> and C<< OP_METHOD_NAMED >> have changed from being | |
| C<< UNOP/SVOP >> to being C<< METHOP >>. | |
| =item * | |
| C<cv_name()> is a new API function that can be passed a CV or GV. It | |
| returns an SV containing the name of the subroutine, for use in | |
| diagnostics. | |
| L<[GH #12767]|https://github.com/Perl/perl5/issues/12767> | |
| L<[GH #13392]|https://github.com/Perl/perl5/issues/13392> | |
| =item * | |
| C<cv_set_call_checker_flags()> is a new API function that works like | |
| C<cv_set_call_checker()>, except that it allows the caller to specify | |
| whether the call checker requires a full GV for reporting the subroutine's | |
| name, or whether it could be passed a CV instead. Whatever value is | |
| passed will be acceptable to C<cv_name()>. C<cv_set_call_checker()> | |
| guarantees there will be a GV, but it may have to create one on the fly, | |
| which is inefficient. | |
| L<[GH #12767]|https://github.com/Perl/perl5/issues/12767> | |
| =item * | |
| C<CvGV> (which is not part of the API) is now a more complex macro, which may | |
| call a function and reify a GV. For those cases where it has been used as a | |
| boolean, C<CvHASGV> has been added, which will return true for CVs that | |
| notionally have GVs, but without reifying the GV. C<CvGV> also returns a GV | |
| now for lexical subs. | |
| L<[GH #13392]|https://github.com/Perl/perl5/issues/13392> | |
| =item * | |
| The L<perlapi/sync_locale> function has been added to the public API. | |
| Changing the program's locale should be avoided by XS code. Nevertheless, | |
| certain non-Perl libraries called from XS need to do so, such as C<Gtk>. | |
| When this happens, Perl needs to be told that the locale has | |
| changed. Use this function to do so, before returning to Perl. | |
| =item * | |
| The defines and labels for the flags in the C<op_private> field of OPs are now | |
| auto-generated from data in F<regen/op_private>. The noticeable effect of this | |
| is that some of the flag output of C<Concise> might differ slightly, and the | |
| flag output of S<C<perl -Dx>> may differ considerably (they both use the same set | |
| of labels now). Also, debugging builds now have a new assertion in | |
| C<op_free()> to ensure that the op doesn't have any unrecognized flags set in | |
| C<op_private>. | |
| =item * | |
| The deprecated variable C<PL_sv_objcount> has been removed. | |
| =item * | |
| Perl now tries to keep the locale category C<LC_NUMERIC> set to "C" | |
| except around operations that need it to be set to the program's | |
| underlying locale. This protects the many XS modules that cannot cope | |
| with the decimal radix character not being a dot. Prior to this | |
| release, Perl initialized this category to "C", but a call to | |
| C<POSIX::setlocale()> would change it. Now such a call will change the | |
| underlying locale of the C<LC_NUMERIC> category for the program, but the | |
| locale exposed to XS code will remain "C". There are new macros | |
| to manipulate the LC_NUMERIC locale, including | |
| C<STORE_LC_NUMERIC_SET_TO_NEEDED> and | |
| C<STORE_LC_NUMERIC_FORCE_TO_UNDERLYING>. | |
| See L<perlapi/Locale-related functions and macros>. | |
| =item * | |
| A new macro L<C<isUTF8_CHAR>|perlapi/isUTF8_CHAR> has been written which | |
| efficiently determines if the string given by its parameters begins | |
| with a well-formed UTF-8 encoded character. | |
| =item * | |
| The following private API functions had their context parameter removed: | |
| C<Perl_cast_ulong>, C<Perl_cast_i32>, C<Perl_cast_iv>, C<Perl_cast_uv>, | |
| C<Perl_cv_const_sv>, C<Perl_mg_find>, C<Perl_mg_findext>, C<Perl_mg_magical>, | |
| C<Perl_mini_mktime>, C<Perl_my_dirfd>, C<Perl_sv_backoff>, C<Perl_utf8_hop>. | |
| Note that the prefix-less versions of those functions that are part of the | |
| public API, such as C<cast_i32()>, remain unaffected. | |
| =item * | |
| The C<PADNAME> and C<PADNAMELIST> types are now separate types, and no | |
| longer simply aliases for SV and AV. | |
| L<[GH #14250]|https://github.com/Perl/perl5/issues/14250>. | |
| =item * | |
| Pad names are now always UTF-8. The C<PadnameUTF8> macro always returns | |
| true. Previously, this was effectively the case already, but any support | |
| for two different internal representations of pad names has now been | |
| removed. | |
| =item * | |
| A new op class, C<UNOP_AUX>, has been added. This is a subclass of | |
| C<UNOP> with an C<op_aux> field added, which points to an array of unions | |
| of UV, SV* etc. It is intended for where an op needs to store more data | |
| than a simple C<op_sv> or whatever. Currently the only op of this type is | |
| C<OP_MULTIDEREF> (see next item). | |
| =item * | |
| A new op has been added, C<OP_MULTIDEREF>, which performs one or more | |
| nested array and hash lookups where the key is a constant or simple | |
| variable. For example the expression C<$a[0]{$k}[$i]>, which previously | |
| involved ten C<rv2Xv>, C<Xelem>, C<gvsv> and C<const> ops is now performed | |
| by a single C<multideref> op. It can also handle C<local>, C<exists> and | |
| C<delete>. A non-simple index expression, such as C<[$i+1]> is still done | |
| using C<aelem>/C<helem>, and single-level array lookup with a small constant | |
| index is still done using C<aelemfast>. | |
| =back | |
| =head1 Selected Bug Fixes | |
| =over 4 | |
| =item * | |
| C<close> now sets C<$!> | |
| When an I/O error occurs, the fact that there has been an error is recorded | |
| in the handle. C<close> returns false for such a handle. Previously, the | |
| value of C<$!> would be untouched by C<close>, so the common convention of | |
| writing S<C<close $fh or die $!>> did not work reliably. Now the handle | |
| records the value of C<$!>, too, and C<close> restores it. | |
| =item * | |
| C<no re> now can turn off everything that C<use re> enables | |
| Previously, running C<no re> would turn off only a few things. Now it | |
| can turn off all the enabled things. For example, the only way to | |
| stop debugging, once enabled, was to exit the enclosing block; that is | |
| now fixed. | |
| =item * | |
| C<pack("D", $x)> and C<pack("F", $x)> now zero the padding on x86 long | |
| double builds. Under some build options on GCC 4.8 and later, they used | |
| to either overwrite the zero-initialized padding, or bypass the | |
| initialized buffer entirely. This caused F<op/pack.t> to fail. | |
| L<[GH #14554]|https://github.com/Perl/perl5/issues/14554> | |
| =item * | |
| Extending an array cloned from a parent thread could result in "Modification of | |
| a read-only value attempted" errors when attempting to modify the new elements. | |
| L<[GH #14605]|https://github.com/Perl/perl5/issues/14605> | |
| =item * | |
| An assertion failure and subsequent crash with C<< *x=<y> >> has been fixed. | |
| L<[GH #14493]|https://github.com/Perl/perl5/issues/14493> | |
| =item * | |
| A possible crashing/looping bug related to compiling lexical subs has been | |
| fixed. | |
| L<[GH #14596]|https://github.com/Perl/perl5/issues/14596> | |
| =item * | |
| UTF-8 now works correctly in function names, in unquoted HERE-document | |
| terminators, and in variable names used as array indexes. | |
| L<[GH #14601]|https://github.com/Perl/perl5/issues/14601> | |
| =item * | |
| Repeated global pattern matches in scalar context on large tainted strings were | |
| exponentially slow depending on the current match position in the string. | |
| L<[GH #14238]|https://github.com/Perl/perl5/issues/14238> | |
| =item * | |
| Various crashes due to the parser getting confused by syntax errors have been | |
| fixed. | |
| L<[GH #14496]|https://github.com/Perl/perl5/issues/14496> | |
| L<[GH #14497]|https://github.com/Perl/perl5/issues/14497> | |
| L<[GH #14548]|https://github.com/Perl/perl5/issues/14548> | |
| L<[GH #14564]|https://github.com/Perl/perl5/issues/14564> | |
| =item * | |
| C<split> in the scope of lexical C<$_> has been fixed not to fail assertions. | |
| L<[GH #14483]|https://github.com/Perl/perl5/issues/14483> | |
| =item * | |
| C<my $x : attr> syntax inside various list operators no longer fails | |
| assertions. | |
| L<[GH #14500]|https://github.com/Perl/perl5/issues/14500> | |
| =item * | |
| An C<@> sign in quotes followed by a non-ASCII digit (which is not a valid | |
| identifier) would cause the parser to crash, instead of simply trying the | |
| C<@> as literal. This has been fixed. | |
| L<[GH #14553]|https://github.com/Perl/perl5/issues/14553> | |
| =item * | |
| C<*bar::=*foo::=*glob_with_hash> has been crashing since Perl 5.14, but no | |
| longer does. | |
| L<[GH #14512]|https://github.com/Perl/perl5/issues/14512> | |
| =item * | |
| C<foreach> in scalar context was not pushing an item on to the stack, resulting | |
| in bugs. (S<C<print 4, scalar do { foreach(@x){} } + 1>> would print 5.) | |
| It has been fixed to return C<undef>. | |
| L<[GH #14569]|https://github.com/Perl/perl5/issues/14569> | |
| =item * | |
| Several cases of data used to store environment variable contents in core C | |
| code being potentially overwritten before being used have been fixed. | |
| L<[GH #14476]|https://github.com/Perl/perl5/issues/14476> | |
| =item * | |
| Some patterns starting with C</.*..../> matched against long strings have | |
| been slow since v5.8, and some of the form C</.*..../i> have been slow | |
| since v5.18. They are now all fast again. | |
| L<[GH #14475]|https://github.com/Perl/perl5/issues/14475>. | |
| =item * | |
| The original visible value of C<$/> is now preserved when it is set to | |
| an invalid value. Previously if you set C<$/> to a reference to an | |
| array, for example, perl would produce a runtime error and not set | |
| C<PL_rs>, but Perl code that checked C<$/> would see the array | |
| reference. | |
| L<[GH #14245]|https://github.com/Perl/perl5/issues/14245>. | |
| =item * | |
| In a regular expression pattern, a POSIX class, like C<[:ascii:]>, must | |
| be inside a bracketed character class, like C<qr/[[:ascii:]]/>. A | |
| warning is issued when something looking like a POSIX class is not | |
| inside a bracketed class. That warning wasn't getting generated when | |
| the POSIX class was negated: C<[:^ascii:]>. This is now fixed. | |
| =item * | |
| Perl 5.14.0 introduced a bug whereby S<C<eval { LABEL: }>> would crash. This | |
| has been fixed. | |
| L<[GH #14438]|https://github.com/Perl/perl5/issues/14438>. | |
| =item * | |
| Various crashes due to the parser getting confused by syntax errors have | |
| been fixed. | |
| L<[GH #14421]|https://github.com/Perl/perl5/issues/14421>. | |
| L<[GH #14472]|https://github.com/Perl/perl5/issues/14472>. | |
| L<[GH #14480]|https://github.com/Perl/perl5/issues/14480>. | |
| L<[GH #14447]|https://github.com/Perl/perl5/issues/14447>. | |
| =item * | |
| Code like C</$a[/> used to read the next line of input and treat it as | |
| though it came immediately after the opening bracket. Some invalid code | |
| consequently would parse and run, but some code caused crashes, so this is | |
| now disallowed. | |
| L<[GH #14462]|https://github.com/Perl/perl5/issues/14462>. | |
| =item * | |
| Fix argument underflow for C<pack>. | |
| L<[GH #14525]|https://github.com/Perl/perl5/issues/14525>. | |
| =item * | |
| Fix handling of non-strict C<\x{}>. Now C<\x{}> is equivalent to C<\x{0}> | |
| instead of faulting. | |
| =item * | |
| C<stat -t> is now no longer treated as stackable, just like C<-t stat>. | |
| L<[GH #14499]|https://github.com/Perl/perl5/issues/14499>. | |
| =item * | |
| The following no longer causes a SEGV: C<qr{x+(y(?0))*}>. | |
| =item * | |
| Fixed infinite loop in parsing backrefs in regexp patterns. | |
| =item * | |
| Several minor bug fixes in behavior of Infinity and NaN, including | |
| warnings when stringifying Infinity-like or NaN-like strings. For example, | |
| "NaNcy" doesn't numify to NaN anymore. | |
| =item * | |
| A bug in regular expression patterns that could lead to segfaults and | |
| other crashes has been fixed. This occurred only in patterns compiled | |
| with C</i> while taking into account the current POSIX locale (which usually | |
| means they have to be compiled within the scope of C<S<use locale>>), | |
| and there must be a string of at least 128 consecutive bytes to match. | |
| L<[GH #14389]|https://github.com/Perl/perl5/issues/14389>. | |
| =item * | |
| C<s///g> now works on very long strings (where there are more than 2 | |
| billion iterations) instead of dying with 'Substitution loop'. | |
| L<[GH #11742]|https://github.com/Perl/perl5/issues/11742>. | |
| L<[GH #14190]|https://github.com/Perl/perl5/issues/14190>. | |
| =item * | |
| C<gmtime> no longer crashes with not-a-number values. | |
| L<[GH #14365]|https://github.com/Perl/perl5/issues/14365>. | |
| =item * | |
| C<\()> (a reference to an empty list), and C<y///> with lexical C<$_> in | |
| scope, could both do a bad write past the end of the stack. They have | |
| both been fixed to extend the stack first. | |
| =item * | |
| C<prototype()> with no arguments used to read the previous item on the | |
| stack, so S<C<print "foo", prototype()>> would print foo's prototype. | |
| It has been fixed to infer C<$_> instead. | |
| L<[GH #14376]|https://github.com/Perl/perl5/issues/14376>. | |
| =item * | |
| Some cases of lexical state subs declared inside predeclared subs could | |
| crash, for example when evalling a string including the name of an outer | |
| variable, but no longer do. | |
| =item * | |
| Some cases of nested lexical state subs inside anonymous subs could cause | |
| 'Bizarre copy' errors or possibly even crashes. | |
| =item * | |
| When trying to emit warnings, perl's default debugger (F<perl5db.pl>) was | |
| sometimes giving 'Undefined subroutine &DB::db_warn called' instead. This | |
| bug, which started to occur in Perl 5.18, has been fixed. | |
| L<[GH #14400]|https://github.com/Perl/perl5/issues/14400>. | |
| =item * | |
| Certain syntax errors in substitutions, such as C<< s/${<>{})// >>, would | |
| crash, and had done so since Perl 5.10. (In some cases the crash did not | |
| start happening till 5.16.) The crash has, of course, been fixed. | |
| L<[GH #14391]|https://github.com/Perl/perl5/issues/14391>. | |
| =item * | |
| Fix a couple of string grow size calculation overflows; in particular, | |
| a repeat expression like S<C<33 x ~3>> could cause a large buffer | |
| overflow since the new output buffer size was not correctly handled by | |
| C<SvGROW()>. An expression like this now properly produces a memory wrap | |
| panic. | |
| L<[GH #14401]|https://github.com/Perl/perl5/issues/14401>. | |
| =item * | |
| C<< formline("@...", "a"); >> would crash. The C<FF_CHECKNL> case in | |
| C<pp_formline()> didn't set the pointer used to mark the chop position, | |
| which led to the C<FF_MORE> case crashing with a segmentation fault. | |
| This has been fixed. | |
| L<[GH #14388]|https://github.com/Perl/perl5/issues/14388>. | |
| =item * | |
| A possible buffer overrun and crash when parsing a literal pattern during | |
| regular expression compilation has been fixed. | |
| L<[GH #14416]|https://github.com/Perl/perl5/issues/14416>. | |
| =item * | |
| C<fchmod()> and C<futimes()> now set C<$!> when they fail due to being | |
| passed a closed file handle. | |
| L<[GH #14073]|https://github.com/Perl/perl5/issues/14073>. | |
| =item * | |
| C<op_free()> and C<scalarvoid()> no longer crash due to a stack overflow | |
| when freeing a deeply recursive op tree. | |
| L<[GH #11866]|https://github.com/Perl/perl5/issues/11866>. | |
| =item * | |
| In Perl 5.20.0, C<$^N> accidentally had the internal UTF-8 flag turned off | |
| if accessed from a code block within a regular expression, effectively | |
| UTF-8-encoding the value. This has been fixed. | |
| L<[GH #14211]|https://github.com/Perl/perl5/issues/14211>. | |
| =item * | |
| A failed C<semctl> call no longer overwrites existing items on the stack, | |
| which means that C<(semctl(-1,0,0,0))[0]> no longer gives an | |
| "uninitialized" warning. | |
| =item * | |
| C<else{foo()}> with no space before C<foo> is now better at assigning the | |
| right line number to that statement. | |
| L<[GH #14070]|https://github.com/Perl/perl5/issues/14070>. | |
| =item * | |
| Sometimes the assignment in C<@array = split> gets optimised so that C<split> | |
| itself writes directly to the array. This caused a bug, preventing this | |
| assignment from being used in lvalue context. So | |
| C<(@a=split//,"foo")=bar()> was an error. (This bug probably goes back to | |
| Perl 3, when the optimisation was added.) It has now been fixed. | |
| L<[GH #14183]|https://github.com/Perl/perl5/issues/14183>. | |
| =item * | |
| When an argument list fails the checks specified by a subroutine | |
| signature (which is still an experimental feature), the resulting error | |
| messages now give the file and line number of the caller, not of the | |
| called subroutine. | |
| L<[GH #13643]|https://github.com/Perl/perl5/issues/13643>. | |
| =item * | |
| The flip-flop operators (C<..> and C<...> in scalar context) used to maintain | |
| a separate state for each recursion level (the number of times the | |
| enclosing sub was called recursively), contrary to the documentation. Now | |
| each closure has one internal state for each flip-flop. | |
| L<[GH #14110]|https://github.com/Perl/perl5/issues/14110>. | |
| =item * | |
| The flip-flop operator (C<..> in scalar context) would return the same | |
| scalar each time, unless the containing subroutine was called recursively. | |
| Now it always returns a new scalar. | |
| L<[GH #14110]|https://github.com/Perl/perl5/issues/14110>. | |
| =item * | |
| C<use>, C<no>, statement labels, special blocks (C<BEGIN>) and pod are now | |
| permitted as the first thing in a C<map> or C<grep> block, the block after | |
| C<print> or C<say> (or other functions) returning a handle, and within | |
| C<${...}>, C<@{...}>, etc. | |
| L<[GH #14088]|https://github.com/Perl/perl5/issues/14088>. | |
| =item * | |
| The repetition operator C<x> now propagates lvalue context to its left-hand | |
| argument when used in contexts like C<foreach>. That allows | |
| S<C<for(($#that_array)x2) { ... }>> to work as expected if the loop modifies | |
| C<$_>. | |
| =item * | |
| C<(...) x ...> in scalar context used to corrupt the stack if one operand | |
| was an object with "x" overloading, causing erratic behavior. | |
| L<[GH #13811]|https://github.com/Perl/perl5/issues/13811>. | |
| =item * | |
| Assignment to a lexical scalar is often optimised away; for example in | |
| C<my $x; $x = $y + $z>, the assign operator is optimised away and the add | |
| operator writes its result directly to C<$x>. Various bugs related to | |
| this optimisation have been fixed. Certain operators on the right-hand | |
| side would sometimes fail to assign the value at all or assign the wrong | |
| value, or would call STORE twice or not at all on tied variables. The | |
| operators affected were C<$foo++>, C<$foo-->, and C<-$foo> under C<use | |
| integer>, C<chomp>, C<chr> and C<setpgrp>. | |
| =item * | |
| List assignments were sometimes buggy if the same scalar ended up on both | |
| sides of the assignment due to use of C<tied>, C<values> or C<each>. The | |
| result would be the wrong value getting assigned. | |
| =item * | |
| C<setpgrp($nonzero)> (with one argument) was accidentally changed in 5.16 | |
| to mean C<setpgrp(0)>. This has been fixed. | |
| =item * | |
| C<__SUB__> could return the wrong value or even corrupt memory under the | |
| debugger (the C<-d> switch) and in subs containing C<eval $string>. | |
| =item * | |
| When S<C<sub () { $var }>> becomes inlinable, it now returns a different | |
| scalar each time, just as a non-inlinable sub would, though Perl still | |
| optimises the copy away in cases where it would make no observable | |
| difference. | |
| =item * | |
| S<C<my sub f () { $var }>> and S<C<sub () : attr { $var }>> are no longer | |
| eligible for inlining. The former would crash; the latter would just | |
| throw the attributes away. An exception is made for the little-known | |
| C<:method> attribute, which does nothing much. | |
| =item * | |
| Inlining of subs with an empty prototype is now more consistent than | |
| before. Previously, a sub with multiple statements, of which all but the last | |
| were optimised away, would be inlinable only if it were an anonymous sub | |
| containing a string C<eval> or C<state> declaration or closing over an | |
| outer lexical variable (or any anonymous sub under the debugger). Now any | |
| sub that gets folded to a single constant after statements have been | |
| optimised away is eligible for inlining. This applies to things like C<sub | |
| () { jabber() if DEBUG; 42 }>. | |
| Some subroutines with an explicit C<return> were being made inlinable, | |
| contrary to the documentation, Now C<return> always prevents inlining. | |
| =item * | |
| On some systems, such as VMS, C<crypt> can return a non-ASCII string. If a | |
| scalar assigned to had contained a UTF-8 string previously, then C<crypt> | |
| would not turn off the UTF-8 flag, thus corrupting the return value. This | |
| would happen with S<C<$lexical = crypt ...>>. | |
| =item * | |
| C<crypt> no longer calls C<FETCH> twice on a tied first argument. | |
| =item * | |
| An unterminated here-doc on the last line of a quote-like operator | |
| (C<qq[${ <<END }]>, C</(?{ <<END })/>) no longer causes a double free. It | |
| started doing so in 5.18. | |
| =item * | |
| C<index()> and C<rindex()> no longer crash when used on strings over 2GB in | |
| size. | |
| L<[GH #13700]|https://github.com/Perl/perl5/issues/13700>. | |
| =item * | |
| A small, previously intentional, memory leak in | |
| C<PERL_SYS_INIT>/C<PERL_SYS_INIT3> on Win32 builds was fixed. This might | |
| affect embedders who repeatedly create and destroy perl engines within | |
| the same process. | |
| =item * | |
| C<POSIX::localeconv()> now returns the data for the program's underlying | |
| locale even when called from outside the scope of S<C<use locale>>. | |
| =item * | |
| C<POSIX::localeconv()> now works properly on platforms which don't have | |
| C<LC_NUMERIC> and/or C<LC_MONETARY>, or for which Perl has been compiled | |
| to disregard either or both of these locale categories. In such | |
| circumstances, there are now no entries for the corresponding values in | |
| the hash returned by C<localeconv()>. | |
| =item * | |
| C<POSIX::localeconv()> now marks appropriately the values it returns as | |
| UTF-8 or not. Previously they were always returned as bytes, even if | |
| they were supposed to be encoded as UTF-8. | |
| =item * | |
| On Microsoft Windows, within the scope of C<S<use locale>>, the following | |
| POSIX character classes gave results for many locales that did not | |
| conform to the POSIX standard: | |
| C<[[:alnum:]]>, | |
| C<[[:alpha:]]>, | |
| C<[[:blank:]]>, | |
| C<[[:digit:]]>, | |
| C<[[:graph:]]>, | |
| C<[[:lower:]]>, | |
| C<[[:print:]]>, | |
| C<[[:punct:]]>, | |
| C<[[:upper:]]>, | |
| C<[[:word:]]>, | |
| and | |
| C<[[:xdigit:]]>. | |
| This was because the underlying Microsoft implementation does not | |
| follow the standard. Perl now takes special precautions to correct for | |
| this. | |
| =item * | |
| Many issues have been detected by L<Coverity|http://www.coverity.com/> and | |
| fixed. | |
| =item * | |
| C<system()> and friends should now work properly on more Android builds. | |
| Due to an oversight, the value specified through C<-Dtargetsh> to F<Configure> | |
| would end up being ignored by some of the build process. This caused perls | |
| cross-compiled for Android to end up with defective versions of C<system()>, | |
| C<exec()> and backticks: the commands would end up looking for C</bin/sh> | |
| instead of C</system/bin/sh>, and so would fail for the vast majority | |
| of devices, leaving C<$!> as C<ENOENT>. | |
| =item * | |
| C<qr(...\(...\)...)>, | |
| C<qr[...\[...\]...]>, | |
| and | |
| C<qr{...\{...\}...}> | |
| now work. Previously it was impossible to escape these three | |
| left-characters with a backslash within a regular expression pattern | |
| where otherwise they would be considered metacharacters, and the pattern | |
| opening delimiter was the character, and the closing delimiter was its | |
| mirror character. | |
| =item * | |
| C<< s///e >> on tainted UTF-8 strings corrupted C<< pos() >>. This bug, | |
| introduced in 5.20, is now fixed. | |
| L<[GH #13948]|https://github.com/Perl/perl5/issues/13948>. | |
| =item * | |
| A non-word boundary in a regular expression (C<< \B >>) did not always | |
| match the end of the string; in particular C<< q{} =~ /\B/ >> did not | |
| match. This bug, introduced in perl 5.14, is now fixed. | |
| L<[GH #13917]|https://github.com/Perl/perl5/issues/13917>. | |
| =item * | |
| C<< " P" =~ /(?=.*P)P/ >> should match, but did not. This is now fixed. | |
| L<[GH #13954]|https://github.com/Perl/perl5/issues/13954>. | |
| =item * | |
| Failing to compile C<use Foo> in an C<eval> could leave a spurious | |
| C<BEGIN> subroutine definition, which would produce a "Subroutine | |
| BEGIN redefined" warning on the next use of C<use>, or other C<BEGIN> | |
| block. | |
| L<[GH #13926]|https://github.com/Perl/perl5/issues/13926>. | |
| =item * | |
| C<method { BLOCK } ARGS> syntax now correctly parses the arguments if they | |
| begin with an opening brace. | |
| L<[GH #9085]|https://github.com/Perl/perl5/issues/9085>. | |
| =item * | |
| External libraries and Perl may have different ideas of what the locale is. | |
| This is problematic when parsing version strings if the locale's numeric | |
| separator has been changed. Version parsing has been patched to ensure | |
| it handles the locales correctly. | |
| L<[GH #13863]|https://github.com/Perl/perl5/issues/13863>. | |
| =item * | |
| A bug has been fixed where zero-length assertions and code blocks inside of a | |
| regex could cause C<pos> to see an incorrect value. | |
| L<[GH #14016]|https://github.com/Perl/perl5/issues/14016>. | |
| =item * | |
| Dereferencing of constants now works correctly for typeglob constants. Previously | |
| the glob was stringified and its name looked up. Now the glob itself is used. | |
| L<[GH #9891]|https://github.com/Perl/perl5/issues/9891> | |
| =item * | |
| When parsing a sigil (C<$> C<@> C<%> C<&)> followed by braces, | |
| the parser no | |
| longer tries to guess whether it is a block or a hash constructor (causing a | |
| syntax error when it guesses the latter), since it can only be a block. | |
| =item * | |
| S<C<undef $reference>> now frees the referent immediately, instead of hanging on | |
| to it until the next statement. | |
| L<[GH #14032]|https://github.com/Perl/perl5/issues/14032> | |
| =item * | |
| Various cases where the name of a sub is used (autoload, overloading, error | |
| messages) used to crash for lexical subs, but have been fixed. | |
| =item * | |
| Bareword lookup now tries to avoid vivifying packages if it turns out the | |
| bareword is not going to be a subroutine name. | |
| =item * | |
| Compilation of anonymous constants (I<e.g.>, C<sub () { 3 }>) no longer deletes | |
| any subroutine named C<__ANON__> in the current package. Not only was | |
| C<*__ANON__{CODE}> cleared, but there was a memory leak, too. This bug goes | |
| back to Perl 5.8.0. | |
| =item * | |
| Stub declarations like C<sub f;> and C<sub f ();> no longer wipe out constants | |
| of the same name declared by C<use constant>. This bug was introduced in Perl | |
| 5.10.0. | |
| =item * | |
| C<qr/[\N{named sequence}]/> now works properly in many instances. | |
| Some names | |
| known to C<\N{...}> refer to a sequence of multiple characters, instead of the | |
| usual single character. Bracketed character classes generally only match | |
| single characters, but now special handling has been added so that they can | |
| match named sequences, but not if the class is inverted or the sequence is | |
| specified as the beginning or end of a range. In these cases, the only | |
| behavior change from before is a slight rewording of the fatal error message | |
| given when this class is part of a C<?[...])> construct. When the C<[...]> | |
| stands alone, the same non-fatal warning as before is raised, and only the | |
| first character in the sequence is used, again just as before. | |
| =item * | |
| Tainted constants evaluated at compile time no longer cause unrelated | |
| statements to become tainted. | |
| L<[GH #14059]|https://github.com/Perl/perl5/issues/14059> | |
| =item * | |
| S<C<open $$fh, ...>>, which vivifies a handle with a name like | |
| C<"main::_GEN_0">, was not giving the handle the right reference count, so | |
| a double free could happen. | |
| =item * | |
| When deciding that a bareword was a method name, the parser would get confused | |
| if an C<our> sub with the same name existed, and look up the method in the | |
| package of the C<our> sub, instead of the package of the invocant. | |
| =item * | |
| The parser no longer gets confused by C<\U=> within a double-quoted string. It | |
| used to produce a syntax error, but now compiles it correctly. | |
| L<[GH #10882]|https://github.com/Perl/perl5/issues/10882> | |
| =item * | |
| It has always been the intention for the C<-B> and C<-T> file test operators to | |
| treat UTF-8 encoded files as text. (L<perlfunc|perlfunc/-X FILEHANDLE> has | |
| been updated to say this.) Previously, it was possible for some files to be | |
| considered UTF-8 that actually weren't valid UTF-8. This is now fixed. The | |
| operators now work on EBCDIC platforms as well. | |
| =item * | |
| Under some conditions warning messages raised during regular expression pattern | |
| compilation were being output more than once. This has now been fixed. | |
| =item * | |
| Perl 5.20.0 introduced a regression in which a UTF-8 encoded regular | |
| expression pattern that contains a single ASCII lowercase letter did not | |
| match its uppercase counterpart. That has been fixed in both 5.20.1 and | |
| 5.22.0. | |
| L<[GH #14051]|https://github.com/Perl/perl5/issues/14051> | |
| =item * | |
| Constant folding could incorrectly suppress warnings if lexical warnings | |
| (C<use warnings> or C<no warnings>) were not in effect and C<$^W> were | |
| false at compile time and true at run time. | |
| =item * | |
| Loading Unicode tables during a regular expression match could cause assertion | |
| failures under debugging builds if the previous match used the very same | |
| regular expression. | |
| L<[GH #14081]|https://github.com/Perl/perl5/issues/14081> | |
| =item * | |
| Thread cloning used to work incorrectly for lexical subs, possibly causing | |
| crashes or double frees on exit. | |
| =item * | |
| Since Perl 5.14.0, deleting C<$SomePackage::{__ANON__}> and then undefining an | |
| anonymous subroutine could corrupt things internally, resulting in | |
| L<Devel::Peek> crashing or L<B.pm|B> giving nonsensical data. This has been | |
| fixed. | |
| =item * | |
| S<C<(caller $n)[3]>> now reports names of lexical subs, instead of | |
| treating them as C<"(unknown)">. | |
| =item * | |
| C<sort subname LIST> now supports using a lexical sub as the comparison | |
| routine. | |
| =item * | |
| Aliasing (I<e.g.>, via S<C<*x = *y>>) could confuse list assignments that mention the | |
| two names for the same variable on either side, causing wrong values to be | |
| assigned. | |
| L<[GH #5788]|https://github.com/Perl/perl5/issues/5788> | |
| =item * | |
| Long here-doc terminators could cause a bad read on short lines of input. This | |
| has been fixed. It is doubtful that any crash could have occurred. This bug | |
| goes back to when here-docs were introduced in Perl 3.000 twenty-five years | |
| ago. | |
| =item * | |
| An optimization in C<split> to treat S<C<split /^/>> like S<C<split /^/m>> had the | |
| unfortunate side-effect of also treating S<C<split /\A/>> like S<C<split /^/m>>, | |
| which it should not. This has been fixed. (Note, however, that S<C<split /^x/>> | |
| does not behave like S<C<split /^x/m>>, which is also considered to be a bug and | |
| will be fixed in a future version.) | |
| L<[GH #14086]|https://github.com/Perl/perl5/issues/14086> | |
| =item * | |
| The little-known S<C<my Class $var>> syntax (see L<fields> and L<attributes>) | |
| could get confused in the scope of C<use utf8> if C<Class> were a constant | |
| whose value contained Latin-1 characters. | |
| =item * | |
| Locking and unlocking values via L<Hash::Util> or C<Internals::SvREADONLY> | |
| no longer has any effect on values that were read-only to begin with. | |
| Previously, unlocking such values could result in crashes, hangs or | |
| other erratic behavior. | |
| =item * | |
| Some unterminated C<(?(...)...)> constructs in regular expressions would | |
| either crash or give erroneous error messages. C</(?(1)/> is one such | |
| example. | |
| =item * | |
| S<C<pack "w", $tied>> no longer calls FETCH twice. | |
| =item * | |
| List assignments like S<C<($x, $z) = (1, $y)>> now work correctly if C<$x> and | |
| C<$y> have been aliased by C<foreach>. | |
| =item * | |
| Some patterns including code blocks with syntax errors, such as | |
| S<C</ (?{(^{})/>>, would hang or fail assertions on debugging builds. Now | |
| they produce errors. | |
| =item * | |
| An assertion failure when parsing C<sort> with debugging enabled has been | |
| fixed. | |
| L<[GH #14087]|https://github.com/Perl/perl5/issues/14087>. | |
| =item * | |
| S<C<*a = *b; @a = split //, $b[1]>> could do a bad read and produce junk | |
| results. | |
| =item * | |
| In S<C<() = @array = split>>, the S<C<() =>> at the beginning no longer confuses | |
| the optimizer into assuming a limit of 1. | |
| =item * | |
| Fatal warnings no longer prevent the output of syntax errors. | |
| L<[GH #14155]|https://github.com/Perl/perl5/issues/14155>. | |
| =item * | |
| Fixed a NaN double-to-long-double conversion error on VMS. For quiet NaNs | |
| (and only on Itanium, not Alpha) negative infinity instead of NaN was | |
| produced. | |
| =item * | |
| Fixed the issue that caused C<< make distclean >> to incorrectly leave some | |
| files behind. | |
| L<[GH #14108]|https://github.com/Perl/perl5/issues/14108>. | |
| =item * | |
| AIX now sets the length in C<< getsockopt >> correctly. | |
| L<[GH #13484]|https://github.com/Perl/perl5/issues/13484>. | |
| L<[cpan #91183]|https://rt.cpan.org/Ticket/Display.html?id=91183>. | |
| L<[cpan #85570]|https://rt.cpan.org/Ticket/Display.html?id=85570>. | |
| =item * | |
| The optimization phase of a regexp compilation could run "forever" and | |
| exhaust all memory under certain circumstances; now fixed. | |
| L<[GH #13984]|https://github.com/Perl/perl5/issues/13984>. | |
| =item * | |
| The test script F<< t/op/crypt.t >> now uses the SHA-256 algorithm if the | |
| default one is disabled, rather than giving failures. | |
| L<[GH #13715]|https://github.com/Perl/perl5/issues/13715>. | |
| =item * | |
| Fixed an off-by-one error when setting the size of a shared array. | |
| L<[GH #14151]|https://github.com/Perl/perl5/issues/14151>. | |
| =item * | |
| Fixed a bug that could cause perl to enter an infinite loop during | |
| compilation. In particular, a C<while(1)> within a sublist, I<e.g.> | |
| sub foo { () = ($a, my $b, ($c, do { while(1) {} })) } | |
| The bug was introduced in 5.20.0 | |
| L<[GH #14165]|https://github.com/Perl/perl5/issues/14165>. | |
| =item * | |
| On Win32, if a variable was C<local>-ized in a pseudo-process that later | |
| forked, restoring the original value in the child pseudo-process caused | |
| memory corruption and a crash in the child pseudo-process (and therefore the | |
| OS process). | |
| L<[GH #8641]|https://github.com/Perl/perl5/issues/8641>. | |
| =item * | |
| Calling C<write> on a format with a C<^**> field could produce a panic | |
| in C<sv_chop()> if there were insufficient arguments or if the variable | |
| used to fill the field was empty. | |
| L<[GH #14255]|https://github.com/Perl/perl5/issues/14255>. | |
| =item * | |
| Non-ASCII lexical sub names now appear without trailing junk when they | |
| appear in error messages. | |
| =item * | |
| The C<\@> subroutine prototype no longer flattens parenthesized arrays | |
| (taking a reference to each element), but takes a reference to the array | |
| itself. | |
| L<[GH #9111]|https://github.com/Perl/perl5/issues/9111>. | |
| =item * | |
| A block containing nothing except a C-style C<for> loop could corrupt the | |
| stack, causing lists outside the block to lose elements or have elements | |
| overwritten. This could happen with C<map { for(...){...} } ...> and with | |
| lists containing C<do { for(...){...} }>. | |
| L<[GH #14269]|https://github.com/Perl/perl5/issues/14269>. | |
| =item * | |
| C<scalar()> now propagates lvalue context, so that | |
| S<C<for(scalar($#foo)) { ... }>> can modify C<$#foo> through C<$_>. | |
| =item * | |
| C<qr/@array(?{block})/> no longer dies with "Bizarre copy of ARRAY". | |
| L<[GH #14292]|https://github.com/Perl/perl5/issues/14292>. | |
| =item * | |
| S<C<eval '$variable'>> in nested named subroutines would sometimes look up a | |
| global variable even with a lexical variable in scope. | |
| =item * | |
| In perl 5.20.0, C<sort CORE::fake> where 'fake' is anything other than a | |
| keyword, started chopping off the last 6 characters and treating the result | |
| as a sort sub name. The previous behavior of treating C<CORE::fake> as a | |
| sort sub name has been restored. | |
| L<[GH #14323]|https://github.com/Perl/perl5/issues/14323>. | |
| =item * | |
| Outside of C<use utf8>, a single-character Latin-1 lexical variable is | |
| disallowed. The error message for it, "Can't use global C<$foo>...", was | |
| giving garbage instead of the variable name. | |
| =item * | |
| C<readline> on a nonexistent handle was causing C<${^LAST_FH}> to produce a | |
| reference to an undefined scalar (or fail an assertion). Now | |
| C<${^LAST_FH}> ends up undefined. | |
| =item * | |
| C<(...) x ...> in void context now applies scalar context to the left-hand | |
| argument, instead of the context the current sub was called in. | |
| L<[GH #14174]|https://github.com/Perl/perl5/issues/14174>. | |
| =back | |
| =head1 Known Problems | |
| =over 4 | |
| =item * | |
| C<pack>-ing a NaN on a perl compiled with Visual C 6 does not behave properly, | |
| leading to a test failure in F<t/op/infnan.t>. | |
| L<[GH #14705]|https://github.com/Perl/perl5/issues/14705> | |
| =item * | |
| A goal is for Perl to be able to be recompiled to work reasonably well on any | |
| Unicode version. In Perl 5.22, though, the earliest such version is Unicode | |
| 5.1 (current is 7.0). | |
| =item * | |
| EBCDIC platforms | |
| =over 4 | |
| =item * | |
| The C<cmp> (and hence C<sort>) operators do not necessarily give the | |
| correct results when both operands are UTF-EBCDIC encoded strings and | |
| there is a mixture of ASCII and/or control characters, along with other | |
| characters. | |
| =item * | |
| Ranges containing C<\N{...}> in the C<tr///> (and C<y///>) | |
| transliteration operators are treated differently than the equivalent | |
| ranges in regular expression patterns. They should, but don't, cause | |
| the values in the ranges to all be treated as Unicode code points, and | |
| not native ones. (L<perlre/Version 8 Regular Expressions> gives | |
| details as to how it should work.) | |
| =item * | |
| Encode and encoding are mostly broken. | |
| =item * | |
| Many CPAN modules that are shipped with core show failing tests. | |
| =item * | |
| C<pack>/C<unpack> with C<"U0"> format may not work properly. | |
| =back | |
| =item * | |
| The following modules are known to have test failures with this version of | |
| Perl. In many cases, patches have been submitted, so there will hopefully be | |
| new releases soon: | |
| =over | |
| =item * | |
| L<B::Generate> version 1.50 | |
| =item * | |
| L<B::Utils> version 0.25 | |
| =item * | |
| L<Coro> version 6.42 | |
| =item * | |
| L<Dancer> version 1.3130 | |
| =item * | |
| L<Data::Alias> version 1.18 | |
| =item * | |
| L<Data::Dump::Streamer> version 2.38 | |
| =item * | |
| L<Data::Util> version 0.63 | |
| =item * | |
| L<Devel::Spy> version 0.07 | |
| =item * | |
| L<invoker> version 0.34 | |
| =item * | |
| L<Lexical::Var> version 0.009 | |
| =item * | |
| L<LWP::ConsoleLogger> version 0.000018 | |
| =item * | |
| L<Mason> version 2.22 | |
| =item * | |
| L<NgxQueue> version 0.02 | |
| =item * | |
| L<Padre> version 1.00 | |
| =item * | |
| L<Parse::Keyword> 0.08 | |
| =back | |
| =back | |
| =head1 Obituary | |
| Brian McCauley died on May 8, 2015. He was a frequent poster to Usenet, Perl | |
| Monks, and other Perl forums, and made several CPAN contributions under the | |
| nick NOBULL, including to the Perl FAQ. He attended almost every | |
| YAPC::Europe, and indeed, helped organise YAPC::Europe 2006 and the QA | |
| Hackathon 2009. His wit and his delight in intricate systems were | |
| particularly apparent in his love of board games; many Perl mongers will | |
| have fond memories of playing Fluxx and other games with Brian. He will be | |
| missed. | |
| =head1 Acknowledgements | |
| Perl 5.22.0 represents approximately 12 months of development since Perl 5.20.0 | |
| and contains approximately 590,000 lines of changes across 2,400 files from 94 | |
| authors. | |
| Excluding auto-generated files, documentation and release tools, there were | |
| approximately 370,000 lines of changes to 1,500 .pm, .t, .c and .h files. | |
| Perl continues to flourish into its third decade thanks to a vibrant community | |
| of users and developers. The following people are known to have contributed the | |
| improvements that became Perl 5.22.0: | |
| Aaron Crane, Abhijit Menon-Sen, Abigail, Alberto Simões, Alex Solovey, Alex | |
| Vandiver, Alexandr Ciornii, Alexandre (Midnite) Jousset, Andreas König, | |
| Andreas Voegele, Andrew Fresh, Andy Dougherty, Anthony Heading, Aristotle | |
| Pagaltzis, brian d foy, Brian Fraser, Chad Granum, Chris 'BinGOs' Williams, | |
| Craig A. Berry, Dagfinn Ilmari Mannsåker, Daniel Dragan, Darin McBride, Dave | |
| Rolsky, David Golden, David Mitchell, David Wheeler, Dmitri Tikhonov, Doug | |
| Bell, E. Choroba, Ed J, Eric Herman, Father Chrysostomos, George Greer, Glenn | |
| D. Golden, Graham Knop, H.Merijn Brand, Herbert Breunung, Hugo van der Sanden, | |
| James E Keenan, James McCoy, James Raspass, Jan Dubois, Jarkko Hietaniemi, | |
| Jasmine Ngan, Jerry D. Hedden, Jim Cromie, John Goodyear, kafka, Karen | |
| Etheridge, Karl Williamson, Kent Fredric, kmx, Lajos Veres, Leon Timmermans, | |
| Lukas Mai, Mathieu Arnold, Matthew Horsfall, Max Maischein, Michael Bunk, | |
| Nicholas Clark, Niels Thykier, Niko Tyni, Norman Koch, Olivier Mengué, Peter | |
| John Acklam, Peter Martini, Petr Písař, Philippe Bruhat (BooK), Pierre | |
| Bogossian, Rafael Garcia-Suarez, Randy Stauner, Reini Urban, Ricardo Signes, | |
| Rob Hoelz, Rostislav Skudnov, Sawyer X, Shirakata Kentaro, Shlomi Fish, | |
| Sisyphus, Slaven Rezic, Smylers, Steffen Müller, Steve Hay, Sullivan Beck, | |
| syber, Tadeusz Sośnierz, Thomas Sibley, Todd Rinaldo, Tony Cook, Vincent Pit, | |
| Vladimir Marek, Yaroslav Kuzmin, Yves Orton, Ævar Arnfjörð Bjarmason. | |
| The list above is almost certainly incomplete as it is automatically generated | |
| from version control history. In particular, it does not include the names of | |
| the (very much appreciated) contributors who reported issues to the Perl bug | |
| tracker. | |
| Many of the changes included in this version originated in the CPAN modules | |
| included in Perl's core. We're grateful to the entire CPAN community for | |
| helping Perl to flourish. | |
| For a more complete list of all of Perl's historical contributors, please see | |
| the F<AUTHORS> file in the Perl source distribution. | |
| =head1 Reporting Bugs | |
| If you find what you think is a bug, you might check the articles recently | |
| posted to the comp.lang.perl.misc newsgroup and the perl bug database at | |
| L<https://rt.perl.org/>. There may also be information at | |
| L<http://www.perl.org/>, the Perl Home Page. | |
| If you believe you have an unreported bug, please run the L<perlbug> program | |
| included with your release. Be sure to trim your bug down to a tiny but | |
| sufficient test case. Your bug report, along with the output of C<perl -V>, | |
| will be sent off to [email protected] to be analysed by the Perl porting team. | |
| If the bug you are reporting has security implications, which make it | |
| inappropriate to send to a publicly archived mailing list, then please send it | |
| to [email protected]. This points to a closed subscription | |
| unarchived mailing list, which includes all the core committers, who will be | |
| able to help assess the impact of issues, figure out a resolution, and help | |
| co-ordinate the release of patches to mitigate or fix the problem across all | |
| platforms on which Perl is supported. Please only use this address for | |
| security issues in the Perl core, not for modules independently distributed on | |
| CPAN. | |
| =head1 SEE ALSO | |
| The F<Changes> file for an explanation of how to view exhaustive details on | |
| what changed. | |
| The F<INSTALL> file for how to build Perl. | |
| The F<README> file for general stuff. | |
| The F<Artistic> and F<Copying> files for copyright information. | |
| =cut | |