diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-15 19:43:11 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-15 19:43:11 +0000 |
commit | fc22b3d6507c6745911b9dfcc68f1e665ae13dbc (patch) | |
tree | ce1e3bce06471410239a6f41282e328770aa404a /upstream/archlinux/man1/perl5200delta.1perl | |
parent | Initial commit. (diff) | |
download | manpages-l10n-fc22b3d6507c6745911b9dfcc68f1e665ae13dbc.tar.xz manpages-l10n-fc22b3d6507c6745911b9dfcc68f1e665ae13dbc.zip |
Adding upstream version 4.22.0.upstream/4.22.0
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'upstream/archlinux/man1/perl5200delta.1perl')
-rw-r--r-- | upstream/archlinux/man1/perl5200delta.1perl | 2722 |
1 files changed, 2722 insertions, 0 deletions
diff --git a/upstream/archlinux/man1/perl5200delta.1perl b/upstream/archlinux/man1/perl5200delta.1perl new file mode 100644 index 00000000..9aa493e9 --- /dev/null +++ b/upstream/archlinux/man1/perl5200delta.1perl @@ -0,0 +1,2722 @@ +.\" -*- mode: troff; coding: utf-8 -*- +.\" Automatically generated by Pod::Man 5.01 (Pod::Simple 3.43) +.\" +.\" Standard preamble: +.\" ======================================================================== +.de Sp \" Vertical space (when we can't use .PP) +.if t .sp .5v +.if n .sp +.. +.de Vb \" Begin verbatim text +.ft CW +.nf +.ne \\$1 +.. +.de Ve \" End verbatim text +.ft R +.fi +.. +.\" \*(C` and \*(C' are quotes in nroff, nothing in troff, for use with C<>. +.ie n \{\ +. ds C` "" +. ds C' "" +'br\} +.el\{\ +. ds C` +. ds C' +'br\} +.\" +.\" Escape single quotes in literal strings from groff's Unicode transform. +.ie \n(.g .ds Aq \(aq +.el .ds Aq ' +.\" +.\" If the F register is >0, we'll generate index entries on stderr for +.\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index +.\" entries marked with X<> in POD. Of course, you'll have to process the +.\" output yourself in some meaningful fashion. +.\" +.\" Avoid warning from groff about undefined register 'F'. +.de IX +.. +.nr rF 0 +.if \n(.g .if rF .nr rF 1 +.if (\n(rF:(\n(.g==0)) \{\ +. if \nF \{\ +. de IX +. tm Index:\\$1\t\\n%\t"\\$2" +.. +. if !\nF==2 \{\ +. nr % 0 +. nr F 2 +. \} +. \} +.\} +.rr rF +.\" ======================================================================== +.\" +.IX Title "PERL5200DELTA 1perl" +.TH PERL5200DELTA 1perl 2024-02-11 "perl v5.38.2" "Perl Programmers Reference Guide" +.\" For nroff, turn off justification. Always turn off hyphenation; it makes +.\" way too many mistakes in technical documents. +.if n .ad l +.nh +.SH NAME +perl5200delta \- what is new for perl v5.20.0 +.SH DESCRIPTION +.IX Header "DESCRIPTION" +This document describes differences between the 5.18.0 release and the +5.20.0 release. +.PP +If you are upgrading from an earlier release such as 5.16.0, first read +perl5180delta, which describes differences between 5.16.0 and 5.18.0. +.SH "Core Enhancements" +.IX Header "Core Enhancements" +.SS "Experimental Subroutine signatures" +.IX Subsection "Experimental Subroutine signatures" +Declarative syntax to unwrap argument list into lexical variables. +\&\f(CW\*(C`sub foo ($a,$b) {...}\*(C'\fR checks the number of arguments and puts the +arguments into lexical variables. Signatures are not equivalent to +the existing idiom of \f(CW\*(C`sub foo { my($a,$b) = @_; ... }\*(C'\fR. Signatures +are only available by enabling a non-default feature, and generate +warnings about being experimental. The syntactic clash with +prototypes is managed by disabling the short prototype syntax when +signatures are enabled. +.PP +See "Signatures" in perlsub for details. +.ie n .SS """sub""s now take a ""prototype"" attribute" +.el .SS "\f(CWsub\fPs now take a \f(CWprototype\fP attribute" +.IX Subsection "subs now take a prototype attribute" +When declaring or defining a \f(CW\*(C`sub\*(C'\fR, the prototype can now be specified inside +of a \f(CW\*(C`prototype\*(C'\fR attribute instead of in parens following the name. +.PP +For example, \f(CW\*(C`sub foo($$){}\*(C'\fR could be rewritten as +\&\f(CW\*(C`sub foo : prototype($$){}\*(C'\fR. +.SS "More consistent prototype parsing" +.IX Subsection "More consistent prototype parsing" +Multiple semicolons in subroutine prototypes have long been tolerated and +treated as a single semicolon. There was one case where this did not +happen. A subroutine whose prototype begins with "*" or ";*" can affect +whether a bareword is considered a method name or sub call. This now +applies also to ";;;*". +.PP +Whitespace has long been allowed inside subroutine prototypes, so +\&\f(CW\*(C`sub( $ $ )\*(C'\fR is equivalent to \f(CWsub($$)\fR, but until now it was stripped +when the subroutine was parsed. Hence, whitespace was \fInot\fR allowed in +prototypes set by \f(CW\*(C`Scalar::Util::set_prototype\*(C'\fR. Now it is permitted, +and the parser no longer strips whitespace. This means +\&\f(CW\*(C`prototype &mysub\*(C'\fR returns the original prototype, whitespace and all. +.ie n .SS """rand"" now uses a consistent random number generator" +.el .SS "\f(CWrand\fP now uses a consistent random number generator" +.IX Subsection "rand now uses a consistent random number generator" +Previously perl would use a platform specific random number generator, varying +between the libc \fBrand()\fR, \fBrandom()\fR or \fBdrand48()\fR. +.PP +This meant that the quality of perl's random numbers would vary from platform +to platform, from the 15 bits of \fBrand()\fR on Windows to 48\-bits on POSIX +platforms such as Linux with \fBdrand48()\fR. +.PP +Perl now uses its own internal \fBdrand48()\fR implementation on all platforms. This +does not make perl's \f(CW\*(C`rand\*(C'\fR cryptographically secure. [perl #115928] +.SS "New slice syntax" +.IX Subsection "New slice syntax" +The new \f(CW%hash{...}\fR and \f(CW%array[...]\fR syntax returns a list of key/value (or +index/value) pairs. See "Key/Value Hash Slices" in perldata. +.SS "Experimental Postfix Dereferencing" +.IX Subsection "Experimental Postfix Dereferencing" +When the \f(CW\*(C`postderef\*(C'\fR feature is in effect, the following syntactical +equivalencies are set up: +.PP +.Vb 5 +\& $sref\->$*; # same as ${ $sref } # interpolates +\& $aref\->@*; # same as @{ $aref } # interpolates +\& $href\->%*; # same as %{ $href } +\& $cref\->&*; # same as &{ $cref } +\& $gref\->**; # same as *{ $gref } +\& +\& $aref\->$#*; # same as $#{ $aref } +\& +\& $gref\->*{ $slot }; # same as *{ $gref }{ $slot } +\& +\& $aref\->@[ ... ]; # same as @$aref[ ... ] # interpolates +\& $href\->@{ ... }; # same as @$href{ ... } # interpolates +\& $aref\->%[ ... ]; # same as %$aref[ ... ] +\& $href\->%{ ... }; # same as %$href{ ... } +.Ve +.PP +Those marked as interpolating only interpolate if the associated +\&\f(CW\*(C`postderef_qq\*(C'\fR feature is also enabled. This feature is \fBexperimental\fR and +will trigger \f(CW\*(C`experimental::postderef\*(C'\fR\-category warnings when used, unless +they are suppressed. +.PP +For more information, consult the Postfix Dereference Syntax section of +perlref. +.SS "Unicode 6.3 now supported" +.IX Subsection "Unicode 6.3 now supported" +Perl now supports and is shipped with Unicode 6.3 (though Perl may be +recompiled with any previous Unicode release as well). A detailed list of +Unicode 6.3 changes is at <http://www.unicode.org/versions/Unicode6.3.0/>. +.ie n .SS "New ""\ep{Unicode}"" regular expression pattern property" +.el .SS "New \f(CW\ep{Unicode}\fP regular expression pattern property" +.IX Subsection "New p{Unicode} regular expression pattern property" +This is a synonym for \f(CW\*(C`\ep{Any}\*(C'\fR and matches the set of Unicode-defined +code points 0 \- 0x10FFFF. +.SS "Better 64\-bit support" +.IX Subsection "Better 64-bit support" +On 64\-bit platforms, the internal array functions now use 64\-bit offsets, +allowing Perl arrays to hold more than 2**31 elements, if you have the memory +available. +.PP +The regular expression engine now supports strings longer than 2**31 +characters. [perl #112790, #116907] +.PP +The functions PerlIO_get_bufsiz, PerlIO_get_cnt, PerlIO_set_cnt and +PerlIO_set_ptrcnt now have SSize_t, rather than int, return values and +parameters. +.ie n .SS """use\ locale"" now works on UTF\-8 locales" +.el .SS "\f(CWuse\ locale\fP now works on UTF\-8 locales" +.IX Subsection "use locale now works on UTF-8 locales" +Until this release, only single-byte locales, such as the ISO 8859 +series were supported. Now, the increasingly common multi-byte UTF\-8 +locales are also supported. A UTF\-8 locale is one in which the +character set is Unicode and the encoding is UTF\-8. The POSIX +\&\f(CW\*(C`LC_CTYPE\*(C'\fR category operations (case changing (like \f(CWlc()\fR, \f(CW"\eU"\fR), +and character classification (\f(CW\*(C`\ew\*(C'\fR, \f(CW\*(C`\eD\*(C'\fR, \f(CW\*(C`qr/[[:punct:]]/\*(C'\fR)) under +such a locale work just as if not under locale, but instead as if under +\&\f(CW\*(C`use\ feature\ \*(Aqunicode_strings\*(Aq\*(C'\fR, except taint rules are followed. +Sorting remains by code point order in this release. [perl #56820]. +.ie n .SS """use\ locale"" now compiles on systems without locale ability" +.el .SS "\f(CWuse\ locale\fP now compiles on systems without locale ability" +.IX Subsection "use locale now compiles on systems without locale ability" +Previously doing this caused the program to not compile. Within its +scope the program behaves as if in the "C" locale. Thus programs +written for platforms that support locales can run on locale-less +platforms without change. Attempts to change the locale away from the +"C" locale will, of course, fail. +.SS "More locale initialization fallback options" +.IX Subsection "More locale initialization fallback options" +If there was an error with locales during Perl start-up, it immediately +gave up and tried to use the \f(CW"C"\fR locale. Now it first tries using +other locales given by the environment variables, as detailed in +"ENVIRONMENT" in perllocale. For example, if \f(CW\*(C`LC_ALL\*(C'\fR and \f(CW\*(C`LANG\*(C'\fR are +both set, and using the \f(CW\*(C`LC_ALL\*(C'\fR locale fails, Perl will now try the +\&\f(CW\*(C`LANG\*(C'\fR locale, and only if that fails, will it fall back to \f(CW"C"\fR. On +Windows machines, Perl will try, ahead of using \f(CW"C"\fR, the system +default locale if all the locales given by environment variables fail. +.ie n .SS """\-DL"" runtime option now added for tracing locale setting" +.el .SS "\f(CW\-DL\fP runtime option now added for tracing locale setting" +.IX Subsection "-DL runtime option now added for tracing locale setting" +This is designed for Perl core developers to aid in field debugging bugs +regarding locales. +.SS "\fB\-F\fP now implies \fB\-a\fP and \fB\-a\fP implies \fB\-n\fP" +.IX Subsection "-F now implies -a and -a implies -n" +Previously \fB\-F\fR without \fB\-a\fR was a no-op, and \fB\-a\fR without \fB\-n\fR or \fB\-p\fR +was a no-op, with this change, if you supply \fB\-F\fR then both \fB\-a\fR and \fB\-n\fR +are implied and if you supply \fB\-a\fR then \fB\-n\fR is implied. +.PP +You can still use \fB\-p\fR for its extra behaviour. [perl #116190] +.ie n .SS "$a and $b warnings exemption" +.el .SS "\f(CW$a\fP and \f(CW$b\fP warnings exemption" +.IX Subsection "$a and $b warnings exemption" +The special variables \f(CW$a\fR and \f(CW$b\fR, used in \f(CW\*(C`sort\*(C'\fR, are now exempt from "used +once" warnings, even where \f(CW\*(C`sort\*(C'\fR is not used. This makes it easier for +CPAN modules to provide functions using \f(CW$a\fR and \f(CW$b\fR for similar purposes. +[perl #120462] +.SH Security +.IX Header "Security" +.SS "Avoid possible read of \fBfree()\fPd memory during parsing" +.IX Subsection "Avoid possible read of free()d memory during parsing" +It was possible that \fBfree()\fRd memory could be read during parsing in the unusual +circumstance of the Perl program ending with a heredoc and the last line of the +file on disk having no terminating newline character. This has now been fixed. +.SH "Incompatible Changes" +.IX Header "Incompatible Changes" +.ie n .SS """do"" can no longer be used to call subroutines" +.el .SS "\f(CWdo\fP can no longer be used to call subroutines" +.IX Subsection "do can no longer be used to call subroutines" +The \f(CW\*(C`do SUBROUTINE(LIST)\*(C'\fR form has resulted in a deprecation warning +since Perl v5.0.0, and is now a syntax error. +.SS "Quote-like escape changes" +.IX Subsection "Quote-like escape changes" +The character after \f(CW\*(C`\ec\*(C'\fR in a double-quoted string ("..." or qq(...)) +or regular expression must now be a printable character and may not be +\&\f(CW\*(C`{\*(C'\fR. +.PP +A literal \f(CW\*(C`{\*(C'\fR after \f(CW\*(C`\eB\*(C'\fR or \f(CW\*(C`\eb\*(C'\fR is now fatal. +.PP +These were deprecated in perl v5.14.0. +.SS "Tainting happens under more circumstances; now conforms to documentation" +.IX Subsection "Tainting happens under more circumstances; now conforms to documentation" +This affects regular expression matching and changing the case of a +string (\f(CW\*(C`lc\*(C'\fR, \f(CW"\eU"\fR, \fIetc\fR.) within the scope of \f(CW\*(C`use locale\*(C'\fR. +The result is now tainted based on the operation, no matter what the +contents of the string were, as the documentation (perlsec, +"SECURITY" in perllocale) indicates it should. Previously, for the case +change operation, if the string contained no characters whose case +change could be affected by the locale, the result would not be tainted. +For example, the result of \f(CWuc()\fR on an empty string or one containing +only above\-Latin1 code points is now tainted, and wasn't before. This +leads to more consistent tainting results. Regular expression patterns +taint their non-binary results (like \f(CW$&\fR, \f(CW$2\fR) if and only if the +pattern contains elements whose matching depends on the current +(potentially tainted) locale. Like the case changing functions, the +actual contents of the string being matched now do not matter, whereas +formerly it did. For example, if the pattern contains a \f(CW\*(C`\ew\*(C'\fR, the +results will be tainted even if the match did not have to use that +portion of the pattern to succeed or fail, because what a \f(CW\*(C`\ew\*(C'\fR matches +depends on locale. However, for example, a \f(CW\*(C`.\*(C'\fR in a pattern will not +enable tainting, because the dot matches any single character, and what +the current locale is doesn't change in any way what matches and what +doesn't. +.ie n .SS """\ep{}"", ""\eP{}"" matching has changed for non-Unicode code points." +.el .SS "\f(CW\ep{}\fP, \f(CW\eP{}\fP matching has changed for non-Unicode code points." +.IX Subsection "p{}, P{} matching has changed for non-Unicode code points." +\&\f(CW\*(C`\ep{}\*(C'\fR and \f(CW\*(C`\eP{}\*(C'\fR are defined by Unicode only on Unicode-defined code +points (\f(CW\*(C`U+0000\*(C'\fR through \f(CW\*(C`U+10FFFF\*(C'\fR). Their behavior on matching +these legal Unicode code points is unchanged, but there are changes for +code points \f(CW0x110000\fR and above. Previously, Perl treated the result +of matching \f(CW\*(C`\ep{}\*(C'\fR and \f(CW\*(C`\eP{}\*(C'\fR against these as \f(CW\*(C`undef\*(C'\fR, which +translates into "false". For \f(CW\*(C`\eP{}\*(C'\fR, this was then complemented into +"true". A warning was supposed to be raised when this happened. +However, various optimizations could prevent the warning, and the +results were often counter-intuitive, with both a match and its seeming +complement being false. Now all non-Unicode code points are treated as +typical unassigned Unicode code points. This generally is more +Do-What-I-Mean. A warning is raised only if the results are arguably +different from a strict Unicode approach, and from what Perl used to do. +Code that needs to be strictly Unicode compliant can make this warning +fatal, and then Perl always raises the warning. +.PP +Details are in "Beyond Unicode code points" in perlunicode. +.ie n .SS """\ep{All}"" has been expanded to match all possible code points" +.el .SS "\f(CW\ep{All}\fP has been expanded to match all possible code points" +.IX Subsection "p{All} has been expanded to match all possible code points" +The Perl-defined regular expression pattern element \f(CW\*(C`\ep{All}\*(C'\fR, unused +on CPAN, used to match just the Unicode code points; now it matches all +possible code points; that is, it is equivalent to \f(CW\*(C`qr/./s\*(C'\fR. Thus +\&\f(CW\*(C`\ep{All}\*(C'\fR is no longer synonymous with \f(CW\*(C`\ep{Any}\*(C'\fR, which continues to +match just the Unicode code points, as Unicode says it should. +.SS "Data::Dumper's output may change" +.IX Subsection "Data::Dumper's output may change" +Depending on the data structures dumped and the settings set for +Data::Dumper, the dumped output may have changed from previous +versions. +.PP +If you have tests that depend on the exact output of Data::Dumper, +they may fail. +.PP +To avoid this problem in your code, test against the data structure +from evaluating the dumped structure, instead of the dump itself. +.ie n .SS "Locale decimal point character no longer leaks outside of ""use\ locale"" scope" +.el .SS "Locale decimal point character no longer leaks outside of \f(CWuse\ locale\fP scope" +.IX Subsection "Locale decimal point character no longer leaks outside of use locale scope" +This is actually a bug fix, but some code has come to rely on the bug +being present, so this change is listed here. The current locale that +the program is running under is not supposed to be visible to Perl code +except within the scope of a \f(CW\*(C`use\ locale\*(C'\fR. However, until now under +certain circumstances, the character used for a decimal point (often a +comma) leaked outside the scope. If your code is affected by this +change, simply add a \f(CW\*(C`use\ locale\*(C'\fR. +.SS "Assignments of Windows sockets error codes to $! now prefer \fIerrno.h\fP values over \fBWSAGetLastError()\fP values" +.IX Subsection "Assignments of Windows sockets error codes to $! now prefer errno.h values over WSAGetLastError() values" +In previous versions of Perl, Windows sockets error codes as returned by +\&\fBWSAGetLastError()\fR were assigned to $!, and some constants such as ECONNABORTED, +not in \fIerrno.h\fR in VC++ (or the various Windows ports of gcc) were defined to +corresponding WSAE* values to allow $! to be tested against the E* constants +exported by Errno and POSIX. +.PP +This worked well until VC++ 2010 and later, which introduced new E* constants +with values > 100 into \fIerrno.h\fR, including some being (re)defined by perl +to WSAE* values. That caused problems when linking XS code against other +libraries which used the original definitions of \fIerrno.h\fR constants. +.PP +To avoid this incompatibility, perl now maps WSAE* error codes to E* values +where possible, and assigns those values to $!. The E* constants exported by +Errno and POSIX are updated to match so that testing $! against them, +wherever previously possible, will continue to work as expected, and all E* +constants found in \fIerrno.h\fR are now exported from those modules with their +original \fIerrno.h\fR values. +.PP +In order to avoid breakage in existing Perl code which assigns WSAE* values to +$!, perl now intercepts the assignment and performs the same mapping to E* +values as it uses internally when assigning to $! itself. +.PP +However, one backwards-incompatibility remains: existing Perl code which +compares $! against the numeric values of the WSAE* error codes that were +previously assigned to $! will now be broken in those cases where a +corresponding E* value has been assigned instead. This is only an issue for +those E* values < 100, which were always exported from Errno and +POSIX with their original \fIerrno.h\fR values, and therefore could not be used +for WSAE* error code tests (e.g. WSAEINVAL is 10022, but the corresponding +EINVAL is 22). (E* values > 100, if present, were redefined to WSAE* +values anyway, so compatibility can be achieved by using the E* constants, +which will work both before and after this change, albeit using different +numeric values under the hood.) +.ie n .SS "Functions ""PerlIO_vsprintf"" and ""PerlIO_sprintf"" have been removed" +.el .SS "Functions \f(CWPerlIO_vsprintf\fP and \f(CWPerlIO_sprintf\fP have been removed" +.IX Subsection "Functions PerlIO_vsprintf and PerlIO_sprintf have been removed" +These two functions, undocumented, unused in CPAN, and problematic, have been +removed. +.SH Deprecations +.IX Header "Deprecations" +.ie n .SS "The ""/\eC/"" character class" +.el .SS "The \f(CW/\eC/\fP character class" +.IX Subsection "The /C/ character class" +The \f(CW\*(C`/\eC/\*(C'\fR regular expression character class is deprecated. From perl +5.22 onwards it will generate a warning, and from perl 5.24 onwards it +will be a regular expression compiler error. If you need to examine the +individual bytes that make up a UTF8\-encoded character, then use +\&\f(CWutf8::encode()\fR on the string (or a copy) first. +.SS "Literal control characters in variable names" +.IX Subsection "Literal control characters in variable names" +This deprecation affects things like $\ecT, where \ecT is a literal control (such +as a \f(CW\*(C`NAK\*(C'\fR or \f(CW\*(C`NEGATIVE ACKNOWLEDGE\*(C'\fR character) in +the source code. Surprisingly, it appears that originally this was intended as +the canonical way of accessing variables like $^T, with the caret form only +being added as an alternative. +.PP +The literal control form is being deprecated for two main reasons. It has what +are likely unfixable bugs, such as $\ecI not working as an alias for $^I, and +their usage not being portable to non-ASCII platforms: While $^T will work +everywhere, \ecT is whitespace in EBCDIC. [perl #119123] +.ie n .SS "References to non-integers and non-positive integers in $/" +.el .SS "References to non-integers and non-positive integers in \f(CW$/\fP" +.IX Subsection "References to non-integers and non-positive integers in $/" +Setting \f(CW$/\fR to a reference to zero or a reference to a negative integer is +now deprecated, and will behave \fBexactly\fR as though it was set to \f(CW\*(C`undef\*(C'\fR. +If you want slurp behavior set \f(CW$/\fR to \f(CW\*(C`undef\*(C'\fR explicitly. +.PP +Setting \f(CW$/\fR to a reference to a non integer is now forbidden and will +throw an error. Perl has never documented what would happen in this +context and while it used to behave the same as setting \f(CW$/\fR to +the address of the references in future it may behave differently, so we +have forbidden this usage. +.SS "Character matching routines in POSIX" +.IX Subsection "Character matching routines in POSIX" +Use of any of these functions in the \f(CW\*(C`POSIX\*(C'\fR module is now deprecated: +\&\f(CW\*(C`isalnum\*(C'\fR, \f(CW\*(C`isalpha\*(C'\fR, \f(CW\*(C`iscntrl\*(C'\fR, \f(CW\*(C`isdigit\*(C'\fR, \f(CW\*(C`isgraph\*(C'\fR, \f(CW\*(C`islower\*(C'\fR, +\&\f(CW\*(C`isprint\*(C'\fR, \f(CW\*(C`ispunct\*(C'\fR, \f(CW\*(C`isspace\*(C'\fR, \f(CW\*(C`isupper\*(C'\fR, and \f(CW\*(C`isxdigit\*(C'\fR. The +functions are buggy and don't work on UTF\-8 encoded strings. See their +entries in POSIX for more information. +.PP +A warning is raised on the first call to any of them from each place in +the code that they are called. (Hence a repeated statement in a loop +will raise just the one warning.) +.SS "Interpreter-based threads are now \fIdiscouraged\fP" +.IX Subsection "Interpreter-based threads are now discouraged" +The "interpreter-based threads" provided by Perl are not the fast, lightweight +system for multitasking that one might expect or hope for. Threads are +implemented in a way that make them easy to misuse. Few people know how to +use them correctly or will be able to provide help. +.PP +The use of interpreter-based threads in perl is officially +discouraged. +.SS "Module removals" +.IX Subsection "Module removals" +The following modules will be removed from the core distribution in a +future release, and will at that time need to be installed from CPAN. +Distributions on CPAN which require these modules will need to list them as +prerequisites. +.PP +The core versions of these modules will now issue \f(CW"deprecated"\fR\-category +warnings to alert you to this fact. To silence these deprecation warnings, +install the modules in question from CPAN. +.PP +Note that the planned removal of these modules from core does not reflect a +judgement about the quality of the code and should not be taken as a suggestion +that their use be halted. Their disinclusion from core primarily hinges on +their necessity to bootstrapping a fully functional, CPAN-capable Perl +installation, not on concerns over their design. +.IP "CGI and its associated CGI:: packages" 4 +.IX Item "CGI and its associated CGI:: packages" +.PD 0 +.IP inc::latest 4 +.IX Item "inc::latest" +.IP Package::Constants 4 +.IX Item "Package::Constants" +.IP "Module::Build and its associated Module::Build:: packages" 4 +.IX Item "Module::Build and its associated Module::Build:: packages" +.PD +.SS "Utility removals" +.IX Subsection "Utility removals" +The following utilities will be removed from the core distribution in a +future release, and will at that time need to be installed from CPAN. +.IP find2perl 4 +.IX Item "find2perl" +.PD 0 +.IP s2p 4 +.IX Item "s2p" +.IP a2p 4 +.IX Item "a2p" +.PD +.SH "Performance Enhancements" +.IX Header "Performance Enhancements" +.IP \(bu 4 +Perl has a new copy-on-write mechanism that avoids the need to copy the +internal string buffer when assigning from one scalar to another. This +makes copying large strings appear much faster. Modifying one of the two +(or more) strings after an assignment will force a copy internally. This +makes it unnecessary to pass strings by reference for efficiency. +.Sp +This feature was already available in 5.18.0, but wasn't enabled by +default. It is the default now, and so you no longer need build perl with +the \fIConfigure\fR argument: +.Sp +.Vb 1 +\& \-Accflags=\-DPERL_NEW_COPY_ON_WRITE +.Ve +.Sp +It can be disabled (for now) in a perl build with: +.Sp +.Vb 1 +\& \-Accflags=\-DPERL_NO_COW +.Ve +.Sp +On some operating systems Perl can be compiled in such a way that any +attempt to modify string buffers shared by multiple SVs will crash. This +way XS authors can test that their modules handle copy-on-write scalars +correctly. See "Copy on Write" in perlguts for detail. +.IP \(bu 4 +Perl has an optimizer for regular expression patterns. It analyzes the pattern +to find things such as the minimum length a string has to be to match, etc. It +now better handles code points that are above the Latin1 range. +.IP \(bu 4 +Executing a regex that contains the \f(CW\*(C`^\*(C'\fR anchor (or its variant under the +\&\f(CW\*(C`/m\*(C'\fR flag) has been made much faster in several situations. +.IP \(bu 4 +Precomputed hash values are now used in more places during method lookup. +.IP \(bu 4 +Constant hash key lookups (\f(CW$hash{key}\fR as opposed to \f(CW$hash{$key}\fR) have +long had the internal hash value computed at compile time, to speed up +lookup. This optimisation has only now been applied to hash slices as +well. +.IP \(bu 4 +Combined \f(CW\*(C`and\*(C'\fR and \f(CW\*(C`or\*(C'\fR operators in void context, like those +generated for \f(CW\*(C`unless ($a && $b)\*(C'\fR and \f(CW\*(C`if ($a || b)\*(C'\fR now +short circuit directly to the end of the statement. [perl #120128] +.IP \(bu 4 +In certain situations, when \f(CW\*(C`return\*(C'\fR is the last statement in a subroutine's +main scope, it will be optimized out. This means code like: +.Sp +.Vb 1 +\& sub baz { return $cat; } +.Ve +.Sp +will now behave like: +.Sp +.Vb 1 +\& sub baz { $cat; } +.Ve +.Sp +which is notably faster. +.Sp +[perl #120765] +.IP \(bu 4 +Code like: +.Sp +.Vb 2 +\& my $x; # or @x, %x +\& my $y; +.Ve +.Sp +is now optimized to: +.Sp +.Vb 1 +\& my ($x, $y); +.Ve +.Sp +In combination with the padrange optimization introduced in +v5.18.0, this means longer uninitialized my +variable statements are also optimized, so: +.Sp +.Vb 1 +\& my $x; my @y; my %z; +.Ve +.Sp +becomes: +.Sp +.Vb 1 +\& my ($x, @y, %z); +.Ve +.Sp +[perl #121077] +.IP \(bu 4 +The creation of certain sorts of lists, including array and hash slices, is now +faster. +.IP \(bu 4 +The optimisation for arrays indexed with a small constant integer is now +applied for integers in the range \-128..127, rather than 0..255. This should +speed up Perl code using expressions like \f(CW$x[\-1]\fR, at the expense of +(presumably much rarer) code using expressions like \f(CW$x[200]\fR. +.IP \(bu 4 +The first iteration over a large hash (using \f(CW\*(C`keys\*(C'\fR or \f(CW\*(C`each\*(C'\fR) is now +faster. This is achieved by preallocating the hash's internal iterator +state, rather than lazily creating it when the hash is first iterated. (For +small hashes, the iterator is still created only when first needed. The +assumption is that small hashes are more likely to be used as objects, and +therefore never allocated. For large hashes, that's less likely to be true, +and the cost of allocating the iterator is swamped by the cost of allocating +space for the hash itself.) +.IP \(bu 4 +When doing a global regex match on a string that came from the \f(CW\*(C`readline\*(C'\fR +or \f(CW\*(C`<>\*(C'\fR operator, the data is no longer copied unnecessarily. +[perl #121259] +.IP \(bu 4 +Dereferencing (as in \f(CW\*(C`$obj\->[0]\*(C'\fR or \f(CW\*(C`$obj\->{k}\*(C'\fR) is now faster +when \f(CW$obj\fR is an instance of a class that has overloaded methods, but +doesn't overload any of the dereferencing methods \f(CW\*(C`@{}\*(C'\fR, \f(CW\*(C`%{}\*(C'\fR, and so on. +.IP \(bu 4 +Perl's optimiser no longer skips optimising code that follows certain +\&\f(CW\*(C`eval {}\*(C'\fR expressions (including those with an apparent infinite loop). +.IP \(bu 4 +The implementation now does a better job of avoiding meaningless work at +runtime. Internal effect-free "null" operations (created as a side-effect of +parsing Perl programs) are normally deleted during compilation. That +deletion is now applied in some situations that weren't previously handled. +.IP \(bu 4 +Perl now does less disk I/O when dealing with Unicode properties that cover +up to three ranges of consecutive code points. +.SH "Modules and Pragmata" +.IX Header "Modules and Pragmata" +.SS "New Modules and Pragmata" +.IX Subsection "New Modules and Pragmata" +.IP \(bu 4 +experimental 0.007 has been added to the Perl core. +.IP \(bu 4 +IO::Socket::IP 0.29 has been added to the Perl core. +.SS "Updated Modules and Pragmata" +.IX Subsection "Updated Modules and Pragmata" +.IP \(bu 4 +Archive::Tar has been upgraded from version 1.90 to 1.96. +.IP \(bu 4 +arybase has been upgraded from version 0.06 to 0.07. +.IP \(bu 4 +Attribute::Handlers has been upgraded from version 0.94 to 0.96. +.IP \(bu 4 +attributes has been upgraded from version 0.21 to 0.22. +.IP \(bu 4 +autodie has been upgraded from version 2.13 to 2.23. +.IP \(bu 4 +AutoLoader has been upgraded from version 5.73 to 5.74. +.IP \(bu 4 +autouse has been upgraded from version 1.07 to 1.08. +.IP \(bu 4 +B has been upgraded from version 1.42 to 1.48. +.IP \(bu 4 +B::Concise has been upgraded from version 0.95 to 0.992. +.IP \(bu 4 +B::Debug has been upgraded from version 1.18 to 1.19. +.IP \(bu 4 +B::Deparse has been upgraded from version 1.20 to 1.26. +.IP \(bu 4 +base has been upgraded from version 2.18 to 2.22. +.IP \(bu 4 +Benchmark has been upgraded from version 1.15 to 1.18. +.IP \(bu 4 +bignum has been upgraded from version 0.33 to 0.37. +.IP \(bu 4 +Carp has been upgraded from version 1.29 to 1.3301. +.IP \(bu 4 +CGI has been upgraded from version 3.63 to 3.65. +NOTE: CGI is deprecated and may be removed from a future version of Perl. +.IP \(bu 4 +charnames has been upgraded from version 1.36 to 1.40. +.IP \(bu 4 +Class::Struct has been upgraded from version 0.64 to 0.65. +.IP \(bu 4 +Compress::Raw::Bzip2 has been upgraded from version 2.060 to 2.064. +.IP \(bu 4 +Compress::Raw::Zlib has been upgraded from version 2.060 to 2.065. +.IP \(bu 4 +Config::Perl::V has been upgraded from version 0.17 to 0.20. +.IP \(bu 4 +constant has been upgraded from version 1.27 to 1.31. +.IP \(bu 4 +CPAN has been upgraded from version 2.00 to 2.05. +.IP \(bu 4 +CPAN::Meta has been upgraded from version 2.120921 to 2.140640. +.IP \(bu 4 +CPAN::Meta::Requirements has been upgraded from version 2.122 to 2.125. +.IP \(bu 4 +CPAN::Meta::YAML has been upgraded from version 0.008 to 0.012. +.IP \(bu 4 +Data::Dumper has been upgraded from version 2.145 to 2.151. +.IP \(bu 4 +DB has been upgraded from version 1.04 to 1.07. +.IP \(bu 4 +DB_File has been upgraded from version 1.827 to 1.831. +.IP \(bu 4 +DBM_Filter has been upgraded from version 0.05 to 0.06. +.IP \(bu 4 +deprecate has been upgraded from version 0.02 to 0.03. +.IP \(bu 4 +Devel::Peek has been upgraded from version 1.11 to 1.16. +.IP \(bu 4 +Devel::PPPort has been upgraded from version 3.20 to 3.21. +.IP \(bu 4 +diagnostics has been upgraded from version 1.31 to 1.34. +.IP \(bu 4 +Digest::MD5 has been upgraded from version 2.52 to 2.53. +.IP \(bu 4 +Digest::SHA has been upgraded from version 5.84 to 5.88. +.IP \(bu 4 +DynaLoader has been upgraded from version 1.18 to 1.25. +.IP \(bu 4 +Encode has been upgraded from version 2.49 to 2.60. +.IP \(bu 4 +encoding has been upgraded from version 2.6_01 to 2.12. +.IP \(bu 4 +English has been upgraded from version 1.06 to 1.09. +.Sp +\&\f(CW$OLD_PERL_VERSION\fR was added as an alias of \f(CW$]\fR. +.IP \(bu 4 +Errno has been upgraded from version 1.18 to 1.20_03. +.IP \(bu 4 +Exporter has been upgraded from version 5.68 to 5.70. +.IP \(bu 4 +ExtUtils::CBuilder has been upgraded from version 0.280210 to 0.280216. +.IP \(bu 4 +ExtUtils::Command has been upgraded from version 1.17 to 1.18. +.IP \(bu 4 +ExtUtils::Embed has been upgraded from version 1.30 to 1.32. +.IP \(bu 4 +ExtUtils::Install has been upgraded from version 1.59 to 1.67. +.IP \(bu 4 +ExtUtils::MakeMaker has been upgraded from version 6.66 to 6.98. +.IP \(bu 4 +ExtUtils::Miniperl has been upgraded from version to 1.01. +.IP \(bu 4 +ExtUtils::ParseXS has been upgraded from version 3.18 to 3.24. +.IP \(bu 4 +ExtUtils::Typemaps has been upgraded from version 3.19 to 3.24. +.IP \(bu 4 +ExtUtils::XSSymSet has been upgraded from version 1.2 to 1.3. +.IP \(bu 4 +feature has been upgraded from version 1.32 to 1.36. +.IP \(bu 4 +fields has been upgraded from version 2.16 to 2.17. +.IP \(bu 4 +File::Basename has been upgraded from version 2.84 to 2.85. +.IP \(bu 4 +File::Copy has been upgraded from version 2.26 to 2.29. +.IP \(bu 4 +File::DosGlob has been upgraded from version 1.10 to 1.12. +.IP \(bu 4 +File::Fetch has been upgraded from version 0.38 to 0.48. +.IP \(bu 4 +File::Find has been upgraded from version 1.23 to 1.27. +.IP \(bu 4 +File::Glob has been upgraded from version 1.20 to 1.23. +.IP \(bu 4 +File::Spec has been upgraded from version 3.40 to 3.47. +.IP \(bu 4 +File::Temp has been upgraded from version 0.23 to 0.2304. +.IP \(bu 4 +FileCache has been upgraded from version 1.08 to 1.09. +.IP \(bu 4 +Filter::Simple has been upgraded from version 0.89 to 0.91. +.IP \(bu 4 +Filter::Util::Call has been upgraded from version 1.45 to 1.49. +.IP \(bu 4 +Getopt::Long has been upgraded from version 2.39 to 2.42. +.IP \(bu 4 +Getopt::Std has been upgraded from version 1.07 to 1.10. +.IP \(bu 4 +Hash::Util::FieldHash has been upgraded from version 1.10 to 1.15. +.IP \(bu 4 +HTTP::Tiny has been upgraded from version 0.025 to 0.043. +.IP \(bu 4 +I18N::Langinfo has been upgraded from version 0.10 to 0.11. +.IP \(bu 4 +I18N::LangTags has been upgraded from version 0.39 to 0.40. +.IP \(bu 4 +if has been upgraded from version 0.0602 to 0.0603. +.IP \(bu 4 +inc::latest has been upgraded from version 0.4003 to 0.4205. +NOTE: inc::latest is deprecated and may be removed from a future version of Perl. +.IP \(bu 4 +integer has been upgraded from version 1.00 to 1.01. +.IP \(bu 4 +IO has been upgraded from version 1.28 to 1.31. +.IP \(bu 4 +IO::Compress::Gzip and friends have been upgraded from version 2.060 to +2.064. +.IP \(bu 4 +IPC::Cmd has been upgraded from version 0.80 to 0.92. +.IP \(bu 4 +IPC::Open3 has been upgraded from version 1.13 to 1.16. +.IP \(bu 4 +IPC::SysV has been upgraded from version 2.03 to 2.04. +.IP \(bu 4 +JSON::PP has been upgraded from version 2.27202 to 2.27203. +.IP \(bu 4 +List::Util has been upgraded from version 1.27 to 1.38. +.IP \(bu 4 +locale has been upgraded from version 1.02 to 1.03. +.IP \(bu 4 +Locale::Codes has been upgraded from version 3.25 to 3.30. +.IP \(bu 4 +Locale::Maketext has been upgraded from version 1.23 to 1.25. +.IP \(bu 4 +Math::BigInt has been upgraded from version 1.9991 to 1.9993. +.IP \(bu 4 +Math::BigInt::FastCalc has been upgraded from version 0.30 to 0.31. +.IP \(bu 4 +Math::BigRat has been upgraded from version 0.2604 to 0.2606. +.IP \(bu 4 +MIME::Base64 has been upgraded from version 3.13 to 3.14. +.IP \(bu 4 +Module::Build has been upgraded from version 0.4003 to 0.4205. +NOTE: Module::Build is deprecated and may be removed from a future version of Perl. +.IP \(bu 4 +Module::CoreList has been upgraded from version 2.89 to 3.10. +.IP \(bu 4 +Module::Load has been upgraded from version 0.24 to 0.32. +.IP \(bu 4 +Module::Load::Conditional has been upgraded from version 0.54 to 0.62. +.IP \(bu 4 +Module::Metadata has been upgraded from version 1.000011 to 1.000019. +.IP \(bu 4 +mro has been upgraded from version 1.11 to 1.16. +.IP \(bu 4 +Net::Ping has been upgraded from version 2.41 to 2.43. +.IP \(bu 4 +Opcode has been upgraded from version 1.25 to 1.27. +.IP \(bu 4 +Package::Constants has been upgraded from version 0.02 to 0.04. +NOTE: Package::Constants is deprecated and may be removed from a future version of Perl. +.IP \(bu 4 +Params::Check has been upgraded from version 0.36 to 0.38. +.IP \(bu 4 +parent has been upgraded from version 0.225 to 0.228. +.IP \(bu 4 +Parse::CPAN::Meta has been upgraded from version 1.4404 to 1.4414. +.IP \(bu 4 +Perl::OSType has been upgraded from version 1.003 to 1.007. +.IP \(bu 4 +perlfaq has been upgraded from version 5.0150042 to 5.0150044. +.IP \(bu 4 +PerlIO has been upgraded from version 1.07 to 1.09. +.IP \(bu 4 +PerlIO::encoding has been upgraded from version 0.16 to 0.18. +.IP \(bu 4 +PerlIO::scalar has been upgraded from version 0.16 to 0.18. +.IP \(bu 4 +PerlIO::via has been upgraded from version 0.12 to 0.14. +.IP \(bu 4 +Pod::Escapes has been upgraded from version 1.04 to 1.06. +.IP \(bu 4 +Pod::Functions has been upgraded from version 1.06 to 1.08. +.IP \(bu 4 +Pod::Html has been upgraded from version 1.18 to 1.21. +.IP \(bu 4 +Pod::Parser has been upgraded from version 1.60 to 1.62. +.IP \(bu 4 +Pod::Perldoc has been upgraded from version 3.19 to 3.23. +.IP \(bu 4 +Pod::Usage has been upgraded from version 1.61 to 1.63. +.IP \(bu 4 +POSIX has been upgraded from version 1.32 to 1.38_03. +.IP \(bu 4 +re has been upgraded from version 0.23 to 0.26. +.IP \(bu 4 +Safe has been upgraded from version 2.35 to 2.37. +.IP \(bu 4 +Scalar::Util has been upgraded from version 1.27 to 1.38. +.IP \(bu 4 +SDBM_File has been upgraded from version 1.09 to 1.11. +.IP \(bu 4 +Socket has been upgraded from version 2.009 to 2.013. +.IP \(bu 4 +Storable has been upgraded from version 2.41 to 2.49. +.IP \(bu 4 +strict has been upgraded from version 1.07 to 1.08. +.IP \(bu 4 +subs has been upgraded from version 1.01 to 1.02. +.IP \(bu 4 +Sys::Hostname has been upgraded from version 1.17 to 1.18. +.IP \(bu 4 +Sys::Syslog has been upgraded from version 0.32 to 0.33. +.IP \(bu 4 +Term::Cap has been upgraded from version 1.13 to 1.15. +.IP \(bu 4 +Term::ReadLine has been upgraded from version 1.12 to 1.14. +.IP \(bu 4 +Test::Harness has been upgraded from version 3.26 to 3.30. +.IP \(bu 4 +Test::Simple has been upgraded from version 0.98 to 1.001002. +.IP \(bu 4 +Text::ParseWords has been upgraded from version 3.28 to 3.29. +.IP \(bu 4 +Text::Tabs has been upgraded from version 2012.0818 to 2013.0523. +.IP \(bu 4 +Text::Wrap has been upgraded from version 2012.0818 to 2013.0523. +.IP \(bu 4 +Thread has been upgraded from version 3.02 to 3.04. +.IP \(bu 4 +Thread::Queue has been upgraded from version 3.02 to 3.05. +.IP \(bu 4 +threads has been upgraded from version 1.86 to 1.93. +.IP \(bu 4 +threads::shared has been upgraded from version 1.43 to 1.46. +.IP \(bu 4 +Tie::Array has been upgraded from version 1.05 to 1.06. +.IP \(bu 4 +Tie::File has been upgraded from version 0.99 to 1.00. +.IP \(bu 4 +Tie::Hash has been upgraded from version 1.04 to 1.05. +.IP \(bu 4 +Tie::Scalar has been upgraded from version 1.02 to 1.03. +.IP \(bu 4 +Tie::StdHandle has been upgraded from version 4.3 to 4.4. +.IP \(bu 4 +Time::HiRes has been upgraded from version 1.9725 to 1.9726. +.IP \(bu 4 +Time::Piece has been upgraded from version 1.20_01 to 1.27. +.IP \(bu 4 +Unicode::Collate has been upgraded from version 0.97 to 1.04. +.IP \(bu 4 +Unicode::Normalize has been upgraded from version 1.16 to 1.17. +.IP \(bu 4 +Unicode::UCD has been upgraded from version 0.51 to 0.57. +.IP \(bu 4 +utf8 has been upgraded from version 1.10 to 1.13. +.IP \(bu 4 +version has been upgraded from version 0.9902 to 0.9908. +.IP \(bu 4 +vmsish has been upgraded from version 1.03 to 1.04. +.IP \(bu 4 +warnings has been upgraded from version 1.18 to 1.23. +.IP \(bu 4 +Win32 has been upgraded from version 0.47 to 0.49. +.IP \(bu 4 +XS::Typemap has been upgraded from version 0.10 to 0.13. +.IP \(bu 4 +XSLoader has been upgraded from version 0.16 to 0.17. +.SH Documentation +.IX Header "Documentation" +.SS "New Documentation" +.IX Subsection "New Documentation" +\fIperlrepository\fR +.IX Subsection "perlrepository" +.PP +This document was removed (actually, renamed perlgit and given a major +overhaul) in Perl v5.14, causing Perl documentation websites to show the now +out of date version in Perl v5.12 as the latest version. It has now been +restored in stub form, directing readers to current information. +.SS "Changes to Existing Documentation" +.IX Subsection "Changes to Existing Documentation" +\fIperldata\fR +.IX Subsection "perldata" +.IP \(bu 4 +New sections have been added to document the new index/value array slice and +key/value hash slice syntax. +.PP +\fIperldebguts\fR +.IX Subsection "perldebguts" +.IP \(bu 4 +The \f(CW\*(C`DB::goto\*(C'\fR and \f(CW\*(C`DB::lsub\*(C'\fR debugger subroutines are now documented. [perl +#77680] +.PP +\fIperlexperiment\fR +.IX Subsection "perlexperiment" +.IP \(bu 4 +\&\f(CW\*(C`\es\*(C'\fR matching \f(CW\*(C`\ecK\*(C'\fR is marked experimental. +.IP \(bu 4 +ithreads were accepted in v5.8.0 (but are discouraged as of v5.20.0). +.IP \(bu 4 +Long doubles are not considered experimental. +.IP \(bu 4 +Code in regular expressions, regular expression backtracking verbs, +and lvalue subroutines are no longer listed as experimental. (This +also affects perlre and perlsub.) +.PP +\fIperlfunc\fR +.IX Subsection "perlfunc" +.IP \(bu 4 +\&\f(CW\*(C`chop\*(C'\fR and \f(CW\*(C`chomp\*(C'\fR now note that they can reset the hash iterator. +.IP \(bu 4 +\&\f(CW\*(C`exec\*(C'\fR's handling of arguments is now more clearly documented. +.IP \(bu 4 +\&\f(CW\*(C`eval EXPR\*(C'\fR now has caveats about expanding floating point numbers in some +locales. +.IP \(bu 4 +\&\f(CW\*(C`goto EXPR\*(C'\fR is now documented to handle an expression that evaluates to a +code reference as if it was \f(CW\*(C`goto &$coderef\*(C'\fR. This behavior is at least ten +years old. +.IP \(bu 4 +Since Perl v5.10, it has been possible for subroutines in \f(CW@INC\fR to return +a reference to a scalar holding initial source code to prepend to the file. +This is now documented. +.IP \(bu 4 +The documentation of \f(CW\*(C`ref\*(C'\fR has been updated to recommend the use of +\&\f(CW\*(C`blessed\*(C'\fR, \f(CW\*(C`isa\*(C'\fR and \f(CW\*(C`reftype\*(C'\fR when dealing with references to blessed +objects. +.PP +\fIperlguts\fR +.IX Subsection "perlguts" +.IP \(bu 4 +Numerous minor changes have been made to reflect changes made to the perl +internals in this release. +.IP \(bu 4 +New sections on Read-Only Values and +Copy on Write have been added. +.PP +\fIperlhack\fR +.IX Subsection "perlhack" +.IP \(bu 4 +The Super Quick Patch Guide section has +been updated. +.PP +\fIperlhacktips\fR +.IX Subsection "perlhacktips" +.IP \(bu 4 +The documentation has been updated to include some more examples of \f(CW\*(C`gdb\*(C'\fR +usage. +.PP +\fIperllexwarn\fR +.IX Subsection "perllexwarn" +.IP \(bu 4 +The perllexwarn documentation used to describe the hierarchy of warning +categories understood by the warnings pragma. That description has now +been moved to the warnings documentation itself, leaving perllexwarn +as a stub that points to it. This change consolidates all documentation for +lexical warnings in a single place. +.PP +\fIperllocale\fR +.IX Subsection "perllocale" +.IP \(bu 4 +The documentation now mentions \fR\f(BIfc()\fR\fI\fR and \f(CW\*(C`\eF\*(C'\fR, and includes many +clarifications and corrections in general. +.PP +\fIperlop\fR +.IX Subsection "perlop" +.IP \(bu 4 +The language design of Perl has always called for monomorphic operators. +This is now mentioned explicitly. +.PP +\fIperlopentut\fR +.IX Subsection "perlopentut" +.IP \(bu 4 +The \f(CW\*(C`open\*(C'\fR tutorial has been completely rewritten by Tom Christiansen, and now +focuses on covering only the basics, rather than providing a comprehensive +reference to all things openable. This rewrite came as the result of a +vigorous discussion on perl5\-porters kicked off by a set of improvements +written by Alexander Hartmaier to the existing perlopentut. A "more than +you ever wanted to know about \f(CW\*(C`open\*(C'\fR" document may follow in subsequent +versions of perl. +.PP +\fIperlre\fR +.IX Subsection "perlre" +.IP \(bu 4 +The fact that the regexp engine makes no effort to call (?{}) and (??{}) +constructs any specified number of times (although it will basically DWIM +in case of a successful match) has been documented. +.IP \(bu 4 +The \f(CW\*(C`/r\*(C'\fR modifier (for non-destructive substitution) is now documented. [perl +#119151] +.IP \(bu 4 +The documentation for \f(CW\*(C`/x\*(C'\fR and \f(CW\*(C`(?# comment)\*(C'\fR has been expanded and clarified. +.PP +\fIperlreguts\fR +.IX Subsection "perlreguts" +.IP \(bu 4 +The documentation has been updated in the light of recent changes to +\&\fIregcomp.c\fR. +.PP +\fIperlsub\fR +.IX Subsection "perlsub" +.IP \(bu 4 +The need to predeclare recursive functions with prototypes in order for the +prototype to be honoured in the recursive call is now documented. [perl #2726] +.IP \(bu 4 +A list of subroutine names used by the perl implementation is now included. +[perl #77680] +.PP +\fIperltrap\fR +.IX Subsection "perltrap" +.IP \(bu 4 +There is now a JavaScript section. +.PP +\fIperlunicode\fR +.IX Subsection "perlunicode" +.IP \(bu 4 +The documentation has been updated to reflect \f(CW\*(C`Bidi_Class\*(C'\fR changes in +Unicode 6.3. +.PP +\fIperlvar\fR +.IX Subsection "perlvar" +.IP \(bu 4 +A new section explaining the performance issues of $`, $& and $', including +workarounds and changes in different versions of Perl, has been added. +.IP \(bu 4 +Three English variable names which have long been documented but do not +actually exist have been removed from the documentation. These were +\&\f(CW$OLD_PERL_VERSION\fR, \f(CW$OFMT\fR, and \f(CW$ARRAY_BASE\fR. +.Sp +(Actually, \f(CW\*(C`OLD_PERL_VERSION\*(C'\fR \fIdoes\fR exist, starting with this revision, but +remained undocumented until perl 5.22.0.) +.PP +\fIperlxs\fR +.IX Subsection "perlxs" +.IP \(bu 4 +Several problems in the \f(CW\*(C`MY_CXT\*(C'\fR example have been fixed. +.SH Diagnostics +.IX Header "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 perldiag. +.SS "New Diagnostics" +.IX Subsection "New Diagnostics" +\fINew Errors\fR +.IX Subsection "New Errors" +.IP \(bu 4 +delete argument is index/value array slice, use array slice +.Sp +(F) You used index/value array slice syntax (\f(CW%array[...]\fR) as the argument to +\&\f(CW\*(C`delete\*(C'\fR. You probably meant \f(CW@array[...]\fR with an @ symbol instead. +.IP \(bu 4 +delete argument is key/value hash slice, use hash slice +.Sp +(F) You used key/value hash slice syntax (\f(CW%hash{...}\fR) as the argument to +\&\f(CW\*(C`delete\*(C'\fR. You probably meant \f(CW@hash{...}\fR with an @ symbol instead. +.IP \(bu 4 +Magical list constants are not supported +.Sp +(F) You assigned a magical array to a stash element, and then tried to use the +subroutine from the same slot. You are asking Perl to do something it cannot +do, details subject to change between Perl versions. +.IP \(bu 4 +Added Setting $/ to a \f(CW%s\fR reference is forbidden +.PP +\fINew Warnings\fR +.IX Subsection "New Warnings" +.IP \(bu 4 +\&\f(CW%s\fR on reference is experimental: +.Sp +The "auto-deref" feature is experimental. +.Sp +Starting in v5.14.0, it was possible to use push, pop, keys, and other +built-in functions not only on aggregate types, but on references to +them. The feature was not deployed to its original intended +specification, and now may become redundant to postfix dereferencing. +It has always been categorized as an experimental feature, and in +v5.20.0 is carries a warning as such. +.Sp +Warnings will now be issued at compile time when these operations are +detected. +.Sp +.Vb 1 +\& no if $] >= 5.01908, warnings => "experimental::autoderef"; +.Ve +.Sp +Consider, though, replacing the use of these features, as they may +change behavior again before becoming stable. +.IP \(bu 4 +A sequence of multiple spaces in a charnames alias definition is deprecated +.Sp +Trailing white-space in a charnames alias definition is deprecated +.Sp +These two deprecation warnings involving \f(CW\*(C`\eN{...}\*(C'\fR were incorrectly +implemented. They did not warn by default (now they do) and could not be +made fatal via \f(CW\*(C`use warnings FATAL => \*(Aqdeprecated\*(Aq\*(C'\fR (now they can). +.IP \(bu 4 +Attribute prototype(%s) discards earlier prototype attribute in same sub +.Sp +(W misc) A sub was declared as \f(CW\*(C`sub foo : prototype(A) : prototype(B) {}\*(C'\fR, for +example. Since each sub can only have one prototype, the earlier +declaration(s) are discarded while the last one is applied. +.IP \(bu 4 +Invalid \e0 character in \f(CW%s\fR for \f(CW%s:\fR \f(CW%s\fR\e0%s +.Sp +(W syscalls) Embedded \e0 characters in pathnames or other system call arguments +produce a warning as of 5.20. The parts after the \e0 were formerly ignored by +system calls. +.IP \(bu 4 +Matched non-Unicode code point 0x%X against Unicode property; may not be portable. +.Sp +This replaces the message "Code point 0x%X is not Unicode, all \ep{} matches +fail; all \eP{} matches succeed". +.IP \(bu 4 +Missing ']' in prototype for \f(CW%s\fR : \f(CW%s\fR +.Sp +(W illegalproto) A grouping was started with \f(CW\*(C`[\*(C'\fR but never closed with \f(CW\*(C`]\*(C'\fR. +.IP \(bu 4 +Possible precedence issue with control flow operator +.Sp +(W syntax) There is a possible problem with the mixing of a control flow +operator (e.g. \f(CW\*(C`return\*(C'\fR) and a low-precedence operator like \f(CW\*(C`or\*(C'\fR. Consider: +.Sp +.Vb 1 +\& sub { return $a or $b; } +.Ve +.Sp +This is parsed as: +.Sp +.Vb 1 +\& sub { (return $a) or $b; } +.Ve +.Sp +Which is effectively just: +.Sp +.Vb 1 +\& sub { return $a; } +.Ve +.Sp +Either use parentheses or the high-precedence variant of the operator. +.Sp +Note this may be also triggered for constructs like: +.Sp +.Vb 1 +\& sub { 1 if die; } +.Ve +.IP \(bu 4 +Postfix dereference is experimental +.Sp +(S experimental::postderef) This warning is emitted if you use the experimental +postfix dereference syntax. Simply suppress the warning if you want to use the +feature, but know that in doing so you are taking the risk of using an +experimental feature which may change or be removed in a future Perl version: +.Sp +.Vb 6 +\& no warnings "experimental::postderef"; +\& use feature "postderef", "postderef_qq"; +\& $ref\->$*; +\& $aref\->@*; +\& $aref\->@[@indices]; +\& ... etc ... +.Ve +.IP \(bu 4 +Prototype '%s' overridden by attribute 'prototype(%s)' in \f(CW%s\fR +.Sp +(W prototype) A prototype was declared in both the parentheses after the sub +name and via the prototype attribute. The prototype in parentheses is useless, +since it will be replaced by the prototype from the attribute before it's ever +used. +.IP \(bu 4 +Scalar value @%s[%s] better written as $%s[%s] +.Sp +(W syntax) In scalar context, you've used an array index/value slice (indicated +by %) to select a single element of an array. Generally it's better to ask for +a scalar value (indicated by $). The difference is that \f(CW$foo[&bar]\fR always +behaves like a scalar, both in the value it returns and when evaluating its +argument, while \f(CW%foo[&bar]\fR provides a list context to its subscript, which +can do weird things if you're expecting only one subscript. When called in +list context, it also returns the index (what \f(CW&bar\fR returns) in addition to +the value. +.IP \(bu 4 +Scalar value @%s{%s} better written as $%s{%s} +.Sp +(W syntax) In scalar context, you've used a hash key/value slice (indicated by +%) to select a single element of a hash. Generally it's better to ask for a +scalar value (indicated by $). The difference is that \f(CW$foo{&bar}\fR always +behaves like a scalar, both in the value it returns and when evaluating its +argument, while \f(CW@foo{&bar}\fR and provides a list context to its subscript, +which can do weird things if you're expecting only one subscript. When called +in list context, it also returns the key in addition to the value. +.IP \(bu 4 +Setting $/ to a reference to \f(CW%s\fR as a form of slurp is deprecated, treating as undef +.IP \(bu 4 +Unexpected exit \f(CW%u\fR +.Sp +(S) \fBexit()\fR was called or the script otherwise finished gracefully when +\&\f(CW\*(C`PERL_EXIT_WARN\*(C'\fR was set in \f(CW\*(C`PL_exit_flags\*(C'\fR. +.IP \(bu 4 +Unexpected exit failure \f(CW%d\fR +.Sp +(S) An uncaught \fBdie()\fR was called when \f(CW\*(C`PERL_EXIT_WARN\*(C'\fR was set in +\&\f(CW\*(C`PL_exit_flags\*(C'\fR. +.IP \(bu 4 +Use of literal control characters in variable names is deprecated +.Sp +(D deprecated) Using literal control characters in the source to refer to the +^FOO variables, like $^X and ${^GLOBAL_PHASE} is now deprecated. This only +affects code like $\ecT, where \ecT is a control (like a \f(CW\*(C`SOH\*(C'\fR) in the +source code: ${"\ecT"} and $^T remain valid. +.IP \(bu 4 +Useless use of greediness modifier +.Sp +This fixes [Perl #42957]. +.SS "Changes to Existing Diagnostics" +.IX Subsection "Changes to Existing Diagnostics" +.IP \(bu 4 +Warnings and errors from the regexp engine are now UTF\-8 clean. +.IP \(bu 4 +The "Unknown switch condition" error message has some slight changes. This +error triggers when there is an unknown condition in a \f(CW\*(C`(?(foo))\*(C'\fR conditional. +The error message used to read: +.Sp +.Vb 1 +\& Unknown switch condition (?(%s in regex; +.Ve +.Sp +But what \f(CW%s\fR could be was mostly up to luck. For \f(CW\*(C`(?(foobar))\*(C'\fR, you might have +seen "fo" or "f". For Unicode characters, you would generally get a corrupted +string. The message has been changed to read: +.Sp +.Vb 1 +\& Unknown switch condition (?(...)) in regex; +.Ve +.Sp +Additionally, the \f(CW\*(Aq<\-\- HERE\*(Aq\fR marker in the error will now point to the +correct spot in the regex. +.IP \(bu 4 +The "%s "\ex%X" does not map to Unicode" warning is now correctly listed as a +severe warning rather than as a fatal error. +.IP \(bu 4 +Under rare circumstances, one could get a "Can't coerce readonly REF to +string" instead of the customary "Modification of a read-only value". This +alternate error message has been removed. +.IP \(bu 4 +"Ambiguous use of * resolved as operator *": This and similar warnings +about "%" and "&" used to occur in some circumstances where there was no +operator of the type cited, so the warning was completely wrong. This has +been fixed [perl #117535, #76910]. +.IP \(bu 4 +Warnings about malformed subroutine prototypes are now more consistent in +how the prototypes are rendered. Some of these warnings would truncate +prototypes containing nulls. In other cases one warning would suppress +another. The warning about illegal characters in prototypes no longer says +"after '_'" if the bad character came before the underscore. +.IP \(bu 4 +Perl folding rules are not up-to-date for 0x%X; please use the perlbug +utility to report; in regex; marked by <\-\- HERE in +m/%s/ +.Sp +This message is now only in the regexp category, and not in the deprecated +category. It is still a default (i.e., severe) warning [perl #89648]. +.IP \(bu 4 +%%s[%s] in scalar context better written as $%s[%s] +.Sp +This warning now occurs for any \f(CW%array[$index]\fR or \f(CW%hash{key}\fR known to +be in scalar context at compile time. Previously it was worded "Scalar +value %%s[%s] better written as $%s[%s]". +.IP \(bu 4 +Switch condition not recognized in regex; marked by <\-\- HERE in m/%s/: +.Sp +The description for this diagnostic has been extended to cover all cases where the warning may occur. +Issues with the positioning of the arrow indicator have also been resolved. +.IP \(bu 4 +The error messages for \f(CWmy($a?$b$c)\fR and \f(CWmy(do{})\fR now mention "conditional +expression" and "do block", respectively, instead of reading 'Can't declare +null operation in "my"'. +.IP \(bu 4 +When \f(CW\*(C`use re "debug"\*(C'\fR executes a regex containing a backreference, the +debugging output now shows what string is being matched. +.IP \(bu 4 +The now fatal error message \f(CW\*(C`Character following "\ec" must be ASCII\*(C'\fR has been +reworded as \f(CW\*(C`Character following "\ec" must be printable ASCII\*(C'\fR to emphasize +that in \f(CW\*(C`\ec\fR\f(CIX\fR\f(CW\*(C'\fR, \fIX\fR must be a \fIprintable (non-control)\fR ASCII character. +.SH "Utility Changes" +.IX Header "Utility Changes" +\fIa2p\fR +.IX Subsection "a2p" +.IP \(bu 4 +A possible crash from an off-by-one error when trying to access before the +beginning of a buffer has been fixed. [perl #120244] +.PP +\fIbisect.pl\fR +.IX Subsection "bisect.pl" +.PP +The git bisection tool \fIPorting/bisect.pl\fR has had many enhancements. +.PP +It is provided as part of the source distribution but not installed because +it is not self-contained as it relies on being run from within a git +checkout. Note also that it makes no attempt to fix tests, correct runtime +bugs or make something useful to install \- its purpose is to make minimal +changes to get any historical revision of interest to build and run as close +as possible to "as-was", and thereby make \f(CW\*(C`git bisect\*(C'\fR easy to use. +.IP \(bu 4 +Can optionally run the test case with a timeout. +.IP \(bu 4 +Can now run in-place in a clean git checkout. +.IP \(bu 4 +Can run the test case under \f(CW\*(C`valgrind\*(C'\fR. +.IP \(bu 4 +Can apply user supplied patches and fixes to the source checkout before +building. +.IP \(bu 4 +Now has fixups to enable building several more historical ranges of bleadperl, +which can be useful for pinpointing the origins of bugs or behaviour changes. +.PP +\fIfind2perl\fR +.IX Subsection "find2perl" +.IP \(bu 4 +find2perl now handles \f(CW\*(C`?\*(C'\fR wildcards correctly. [perl #113054] +.PP +\fIperlbug\fR +.IX Subsection "perlbug" +.IP \(bu 4 +\&\fIperlbug\fR now has a \f(CW\*(C`\-p\*(C'\fR option for attaching patches with a bug report. +.IP \(bu 4 +perlbug has been modified to supply the report template with CRLF line +endings on Windows. +[GH #13612] <https://github.com/Perl/perl5/issues/13612> +.IP \(bu 4 +perlbug now makes as few assumptions as possible about the encoding of the +report. This will likely change in the future to assume UTF\-8 by default but +allow a user override. +.SH "Configuration and Compilation" +.IX Header "Configuration and Compilation" +.IP \(bu 4 +The \fIMakefile.PL\fR for SDBM_File now generates a better \fIMakefile\fR, which +avoids a race condition during parallel makes, which could cause the build to +fail. This is the last known parallel make problem (on *nix platforms), and +therefore we believe that a parallel make should now always be error free. +.IP \(bu 4 +\&\fIinstallperl\fR and \fIinstallman\fR's option handling has been refactored to use +Getopt::Long. Both are used by the \fIMakefile\fR \f(CW\*(C`install\*(C'\fR targets, and +are not installed, so these changes are only likely to affect custom +installation scripts. +.RS 4 +.IP \(bu 4 +Single letter options now also have long names. +.IP \(bu 4 +Invalid options are now rejected. +.IP \(bu 4 +Command line arguments that are not options are now rejected. +.IP \(bu 4 +Each now has a \f(CW\*(C`\-\-help\*(C'\fR option to display the usage message. +.RE +.RS 4 +.Sp +The behaviour for all valid documented invocations is unchanged. +.RE +.IP \(bu 4 +Where possible, the build now avoids recursive invocations of \fImake\fR when +building pure-Perl extensions, without removing any parallelism from the +build. Currently around 80 extensions can be processed directly by the +\&\fImake_ext.pl\fR tool, meaning that 80 invocations of \fImake\fR and 160 +invocations of \fIminiperl\fR are no longer made. +.IP \(bu 4 +The build system now works correctly when compiling under GCC or Clang with +link-time optimization enabled (the \f(CW\*(C`\-flto\*(C'\fR option). [perl #113022] +.IP \(bu 4 +Distinct library basenames with \f(CW\*(C`d_libname_unique\*(C'\fR. +.Sp +When compiling perl with this option, the library files for XS modules are +named something "unique" \-\- for example, Hash/Util/Util.so becomes +Hash/Util/PL_Hash_\|_Util.so. This behavior is similar to what currently +happens on VMS, and serves as groundwork for the Android port. +.IP \(bu 4 +\&\f(CW\*(C`sysroot\*(C'\fR option to indicate the logical root directory under gcc and clang. +.Sp +When building with this option set, both Configure and the compilers search +for all headers and libraries under this new sysroot, instead of /. +.Sp +This is a huge time saver if cross-compiling, but can also help +on native builds if your toolchain's files have non-standard locations. +.IP \(bu 4 +The cross-compilation model has been renovated. +There's several new options, and some backwards-incompatible changes: +.Sp +We now build binaries for miniperl and generate_uudmap to be used on the host, +rather than running every miniperl call on the target; this means that, short +of 'make test', we no longer need access to the target system once Configure is +done. You can provide already-built binaries through the \f(CW\*(C`hostperl\*(C'\fR and +\&\f(CW\*(C`hostgenerate\*(C'\fR options to Configure. +.Sp +Additionally, if targeting an EBCDIC platform from an ASCII host, +or viceversa, you'll need to run Configure with \f(CW\*(C`\-Uhostgenerate\*(C'\fR, to +indicate that generate_uudmap should be run on the target. +.Sp +Finally, there's also a way of having Configure end early, right after +building the host binaries, by cross-compiling without specifying a +\&\f(CW\*(C`targethost\*(C'\fR. +.Sp +The incompatible changes include no longer using xconfig.h, xlib, or +Cross.pm, so canned config files and Makefiles will have to be updated. +.IP \(bu 4 +Related to the above, there is now a way of specifying the location of sh +(or equivalent) on the target system: \f(CW\*(C`targetsh\*(C'\fR. +.Sp +For example, Android has its sh in /system/bin/sh, so if cross-compiling +from a more normal Unixy system with sh in /bin/sh, "targetsh" would end +up as /system/bin/sh, and "sh" as /bin/sh. +.IP \(bu 4 +By default, \fBgcc\fR 4.9 does some optimizations that break perl. The \fB\-fwrapv\fR +option disables those optimizations (and probably others), so for \fBgcc\fR 4.3 +and later (since the there might be similar problems lurking on older versions +too, but \fB\-fwrapv\fR was broken before 4.3, and the optimizations probably won't +go away), \fIConfigure\fR now adds \fB\-fwrapv\fR unless the user requests +\&\fB\-fno\-wrapv\fR, which disables \fB\-fwrapv\fR, or \fB\-fsanitize=undefined\fR, which +turns the overflows \fB\-fwrapv\fR ignores into runtime errors. +[GH #13690] <https://github.com/Perl/perl5/issues/13690> +.SH Testing +.IX Header "Testing" +.IP \(bu 4 +The \f(CW\*(C`test.valgrind\*(C'\fR make target now allows tests to be run in parallel. +This target allows Perl's test suite to be run under Valgrind, which detects +certain sorts of C programming errors, though at significant cost in running +time. On suitable hardware, allowing parallel execution claws back a lot of +that additional cost. [perl #121431] +.IP \(bu 4 +Various tests in \fIt/porting/\fR are no longer skipped when the perl +\&\fI.git\fR directory is outside the perl tree and pointed to by +\&\f(CW$GIT_DIR\fR. [perl #120505] +.IP \(bu 4 +The test suite no longer fails when the user's interactive shell maintains a +\&\f(CW$PWD\fR environment variable, but the \fI/bin/sh\fR used for running tests +doesn't. +.SH "Platform Support" +.IX Header "Platform Support" +.SS "New Platforms" +.IX Subsection "New Platforms" +.IP Android 4 +.IX Item "Android" +Perl can now be built for Android, either natively or through +cross-compilation, for all three currently available architectures (ARM, +MIPS, and x86), on a wide range of versions. +.IP Bitrig 4 +.IX Item "Bitrig" +Compile support has been added for Bitrig, a fork of OpenBSD. +.IP FreeMiNT 4 +.IX Item "FreeMiNT" +Support has been added for FreeMiNT, a free open-source OS for the Atari ST +system and its successors, based on the original MiNT that was officially +adopted by Atari. +.IP Synology 4 +.IX Item "Synology" +Synology ships its NAS boxes with a lean Linux distribution (DSM) on relative +cheap CPU's (like the Marvell Kirkwood mv6282 \- ARMv5tel or Freescale QorIQ +P1022 ppc \- e500v2) not meant for workstations or development. These boxes +should build now. The basic problems are the non-standard location for tools. +.SS "Discontinued Platforms" +.IX Subsection "Discontinued Platforms" +.ie n .IP """sfio""" 4 +.el .IP \f(CWsfio\fR 4 +.IX Item "sfio" +Code related to supporting the \f(CW\*(C`sfio\*(C'\fR I/O system has been removed. +.Sp +Perl 5.004 added support to use the native API of \f(CW\*(C`sfio\*(C'\fR, AT&T's Safe/Fast +I/O library. This code still built with v5.8.0, albeit with many regression +tests failing, but was inadvertently broken before the v5.8.1 release, +meaning that it has not worked on any version of Perl released since then. +In over a decade we have received no bug reports about this, hence it is clear +that no-one is using this functionality on any version of Perl that is still +supported to any degree. +.IP "AT&T 3b1" 4 +.IX Item "AT&T 3b1" +Configure support for the 3b1, also known as the AT&T Unix PC (and the similar +AT&T 7300), has been removed. +.IP DG/UX 4 +.IX Item "DG/UX" +DG/UX was a Unix sold by Data General. The last release was in April 2001. +It only runs on Data General's own hardware. +.IP EBCDIC 4 +.IX Item "EBCDIC" +In the absence of a regular source of smoke reports, code intended to support +native EBCDIC platforms will be removed from perl before 5.22.0. +.SS "Platform-Specific Notes" +.IX Subsection "Platform-Specific Notes" +.IP Cygwin 4 +.IX Item "Cygwin" +.RS 4 +.PD 0 +.IP \(bu 4 +.PD +\&\fBrecv()\fR on a connected handle would populate the returned sender +address with whatever happened to be in the working buffer. \fBrecv()\fR +now uses a workaround similar to the Win32 \fBrecv()\fR wrapper and returns +an empty string when \fBrecvfrom\fR\|(2) doesn't modify the supplied address +length. [perl #118843] +.IP \(bu 4 +Fixed a build error in cygwin.c on Cygwin 1.7.28. +.Sp +Tests now handle the errors that occur when \f(CW\*(C`cygserver\*(C'\fR isn't +running. +.RE +.RS 4 +.RE +.IP GNU/Hurd 4 +.IX Item "GNU/Hurd" +The BSD compatibility library \f(CW\*(C`libbsd\*(C'\fR is no longer required for builds. +.IP Linux 4 +.IX Item "Linux" +The hints file now looks for \f(CW\*(C`libgdbm_compat\*(C'\fR only if \f(CW\*(C`libgdbm\*(C'\fR itself is +also wanted. The former is never useful without the latter, and in some +circumstances, including it could actually prevent building. +.IP "Mac OS" 4 +.IX Item "Mac OS" +The build system now honors an \f(CW\*(C`ld\*(C'\fR setting supplied by the user running +\&\fIConfigure\fR. +.IP MidnightBSD 4 +.IX Item "MidnightBSD" +\&\f(CW\*(C`objformat\*(C'\fR was removed from version 0.4\-RELEASE of MidnightBSD and had been +deprecated on earlier versions. This caused the build environment to be +erroneously configured for \f(CW\*(C`a.out\*(C'\fR rather than \f(CW\*(C`elf\*(C'\fR. This has been now +been corrected. +.IP "Mixed-endian platforms" 4 +.IX Item "Mixed-endian platforms" +The code supporting \f(CW\*(C`pack\*(C'\fR and \f(CW\*(C`unpack\*(C'\fR operations on mixed endian +platforms has been removed. We believe that Perl has long been unable to +build on mixed endian architectures (such as PDP\-11s), so we don't think +that this change will affect any platforms which were able to build v5.18.0. +.IP VMS 4 +.IX Item "VMS" +.RS 4 +.PD 0 +.IP \(bu 4 +.PD +The \f(CW\*(C`PERL_ENV_TABLES\*(C'\fR feature to control the population of \f(CW%ENV\fR at perl +start-up was broken in Perl 5.16.0 but has now been fixed. +.IP \(bu 4 +Skip access checks on remotes in \fBopendir()\fR. [perl #121002] +.IP \(bu 4 +A check for glob metacharacters in a path returned by the +\&\f(CWglob()\fR operator has been replaced with a check for VMS +wildcard characters. This saves a significant number of unnecessary +\&\f(CWlstat()\fR calls such that some simple glob operations become +60\-80% faster. +.RE +.RS 4 +.RE +.IP Win32 4 +.IX Item "Win32" +.RS 4 +.PD 0 +.IP \(bu 4 +.PD +\&\f(CW\*(C`rename\*(C'\fR and \f(CW\*(C`link\*(C'\fR on Win32 now set $! to ENOSPC and EDQUOT when +appropriate. [perl #119857] +.IP \(bu 4 +The BUILD_STATIC and ALL_STATIC makefile options for linking some or (nearly) +all extensions statically (into perl520.dll, and into a separate +perl\-static.exe too) were broken for MinGW builds. This has now been fixed. +.Sp +The ALL_STATIC option has also been improved to include the Encode and Win32 +extensions (for both VC++ and MinGW builds). +.IP \(bu 4 +Support for building with Visual C++ 2013 has been added. There are currently +two possible test failures (see "Testing Perl on Windows" in perlwin32) which +will hopefully be resolved soon. +.IP \(bu 4 +Experimental support for building with Intel C++ Compiler has been added. The +nmake makefile (win32/Makefile) and the dmake makefile (win32/makefile.mk) can +be used. A "nmake test" will not pass at this time due to \fIcpan/CGI/t/url.t\fR. +.IP \(bu 4 +Killing a process tree with "kill" in perlfunc and a negative signal, was broken +starting in 5.18.0. In this bug, \f(CW\*(C`kill\*(C'\fR always returned 0 for a negative +signal even for valid PIDs, and no processes were terminated. This has been +fixed [perl #121230]. +.IP \(bu 4 +The time taken to build perl on Windows has been reduced quite significantly +(time savings in the region of 30\-40% are typically seen) by reducing the +number of, usually failing, I/O calls for each \f(CWrequire()\fR +(for \fBminiperl.exe\fR only). +[GH #13566] <https://github.com/Perl/perl5/issues/13566> +.IP \(bu 4 +About 15 minutes of idle sleeping was removed from running \f(CW\*(C`make test\*(C'\fR due to +a bug in which the timeout monitor used for tests could not be cancelled once +the test completes, and the full timeout period elapsed before running the next +test file. +[GH #13647] <https://github.com/Perl/perl5/issues/13647> +.IP \(bu 4 +On a perl built without pseudo-fork (pseudo-fork builds were not affected by +this bug), killing a process tree with \f(CWkill()\fR and a negative +signal resulted in \f(CWkill()\fR inverting the returned value. For example, if +\&\f(CWkill()\fR killed 1 process tree PID then it returned 0 instead of 1, and if +\&\f(CWkill()\fR was passed 2 invalid PIDs then it returned 2 instead of 0. This has +probably been the case since the process tree kill feature was implemented on +Win32. It has now been corrected to follow the documented behaviour. +[GH #13595] <https://github.com/Perl/perl5/issues/13595> +.IP \(bu 4 +When building a 64\-bit perl, an uninitialized memory read in \fBminiperl.exe\fR, +used during the build process, could lead to a 4GB \fBwperl.exe\fR being created. +This has now been fixed. (Note that \fBperl.exe\fR itself was unaffected, but +obviously \fBwperl.exe\fR would have been completely broken.) +[GH #13677] <https://github.com/Perl/perl5/issues/13677> +.IP \(bu 4 +Perl can now be built with \fBgcc\fR version 4.8.1 from <http://www.mingw.org>. +This was previously broken due to an incorrect definition of \fBDllMain()\fR in one +of perl's source files. Earlier \fBgcc\fR versions were also affected when using +version 4 of the w32api package. Versions of \fBgcc\fR available from +<http://mingw\-w64.sourceforge.net/> were not affected. +[GH #13733] <https://github.com/Perl/perl5/issues/13733> +.IP \(bu 4 +The test harness now has no failures when perl is built on a FAT drive with the +Windows OS on an NTFS drive. +[GH #6348] <https://github.com/Perl/perl5/issues/6348> +.IP \(bu 4 +When cloning the context stack in \fBfork()\fR emulation, \fBPerl_cx_dup()\fR +would crash accessing parameter information for context stack entries +that included no parameters, as with \f(CW\*(C`&foo;\*(C'\fR. +[GH #13763] <https://github.com/Perl/perl5/issues/13763> +.IP \(bu 4 +Introduced by +[GH #12161] <https://github.com/Perl/perl5/issues/12161>, a memory +leak on every call to \f(CW\*(C`system\*(C'\fR and backticks (\f(CW \`\` \fR), on most Win32 Perls +starting from 5.18.0 has been fixed. The memory leak only occurred if you +enabled pseudo-fork in your build of Win32 Perl, and were running that build on +Server 2003 R2 or newer OS. The leak does not appear on WinXP SP3. +[GH #13741] <https://github.com/Perl/perl5/issues/13741> +.RE +.RS 4 +.RE +.IP WinCE 4 +.IX Item "WinCE" +.RS 4 +.PD 0 +.IP \(bu 4 +.PD +The building of XS modules has largely been restored. Several still cannot +(yet) be built but it is now possible to build Perl on WinCE with only a couple +of further patches (to Socket and ExtUtils::MakeMaker), hopefully to be +incorporated soon. +.IP \(bu 4 +Perl can now be built in one shot with no user intervention on WinCE by running +\&\f(CW\*(C`nmake \-f Makefile.ce all\*(C'\fR. +.Sp +Support for building with EVC (Embedded Visual C++) 4 has been restored. Perl +can also be built using Smart Devices for Visual C++ 2005 or 2008. +.RE +.RS 4 +.RE +.SH "Internal Changes" +.IX Header "Internal Changes" +.IP \(bu 4 +The internal representation has changed for the match variables \f(CW$1\fR, \f(CW$2\fR etc., +$`, $&, $', ${^PREMATCH}, ${^MATCH} and ${^POSTMATCH}. It uses slightly less +memory, avoids string comparisons and numeric conversions during lookup, and +uses 23 fewer lines of C. This change should not affect any external code. +.IP \(bu 4 +Arrays now use NULL internally to represent unused slots, instead of +&PL_sv_undef. &PL_sv_undef is no longer treated as a special value, so +av_store(av, 0, &PL_sv_undef) will cause element 0 of that array to hold a +read-only undefined scalar. \f(CW\*(C`$array[0] = anything\*(C'\fR will croak and +\&\f(CW\*(C`\e$array[0]\*(C'\fR will compare equal to \f(CW\*(C`\eundef\*(C'\fR. +.IP \(bu 4 +The SV returned by \fBHeSVKEY_force()\fR now correctly reflects the UTF8ness of the +underlying hash key when that key is not stored as a SV. [perl #79074] +.IP \(bu 4 +Certain rarely used functions and macros available to XS code are now +deprecated. These are: +\&\f(CW\*(C`utf8_to_uvuni_buf\*(C'\fR (use \f(CW\*(C`utf8_to_uvchr_buf\*(C'\fR instead), +\&\f(CW\*(C`valid_utf8_to_uvuni\*(C'\fR (use \f(CW\*(C`utf8_to_uvchr_buf\*(C'\fR instead), +\&\f(CW\*(C`NATIVE_TO_NEED\*(C'\fR (this did not work properly anyway), +and \f(CW\*(C`ASCII_TO_NEED\*(C'\fR (this did not work properly anyway). +.Sp +Starting in this release, almost never does application code need to +distinguish between the platform's character set and Latin1, on which the +lowest 256 characters of Unicode are based. New code should not use +\&\f(CW\*(C`utf8n_to_uvuni\*(C'\fR (use \f(CW\*(C`utf8_to_uvchr_buf\*(C'\fR instead), +nor +\&\f(CW\*(C`uvuni_to_utf8\*(C'\fR (use \f(CW\*(C`uvchr_to_utf8\*(C'\fR instead), +.IP \(bu 4 +The Makefile shortcut targets for many rarely (or never) used testing and +profiling targets have been removed, or merged into the only other Makefile +target that uses them. Specifically, these targets are gone, along with +documentation that referenced them or explained how to use them: +.Sp +.Vb 10 +\& check.third check.utf16 check.utf8 coretest minitest.prep +\& minitest.utf16 perl.config.dashg perl.config.dashpg +\& perl.config.gcov perl.gcov perl.gprof perl.gprof.config +\& perl.pixie perl.pixie.atom perl.pixie.config perl.pixie.irix +\& perl.third perl.third.config perl.valgrind.config purecovperl +\& pureperl quantperl test.deparse test.taintwarn test.third +\& test.torture test.utf16 test.utf8 test_notty.deparse +\& test_notty.third test_notty.valgrind test_prep.third +\& test_prep.valgrind torturetest ucheck ucheck.third ucheck.utf16 +\& ucheck.valgrind utest utest.third utest.utf16 utest.valgrind +.Ve +.Sp +It's still possible to run the relevant commands by "hand" \- no underlying +functionality has been removed. +.IP \(bu 4 +It is now possible to keep Perl from initializing locale handling. +For the most part, Perl doesn't pay attention to locale. (See +perllocale.) Nonetheless, until now, on startup, it has always +initialized locale handling to the system default, just in case the +program being executed ends up using locales. (This is one of the first +things a locale-aware program should do, long before Perl knows if it +will actually be needed or not.) This works well except when Perl is +embedded in another application which wants a locale that isn't the +system default. Now, if the environment variable +\&\f(CW\*(C`PERL_SKIP_LOCALE_INIT\*(C'\fR is set at the time Perl is started, this +initialization step is skipped. Prior to this, on Windows platforms, +the only workaround for this deficiency was to use a hacked-up copy of +internal Perl code. Applications that need to use older Perls can +discover if the embedded Perl they are using needs the workaround by +testing that the C preprocessor symbol \f(CW\*(C`HAS_SKIP_LOCALE_INIT\*(C'\fR is not +defined. [RT #38193] +.IP \(bu 4 +\&\f(CW\*(C`BmRARE\*(C'\fR and \f(CW\*(C`BmPREVIOUS\*(C'\fR have been removed. They were not used anywhere +and are not part of the API. For XS modules, they are now #defined as 0. +.IP \(bu 4 +\&\f(CW\*(C`sv_force_normal\*(C'\fR, which usually croaks on read-only values, used to allow +read-only values to be modified at compile time. This has been changed to +croak on read-only values regardless. This change uncovered several core +bugs. +.IP \(bu 4 +Perl's new copy-on-write mechanism (which is now enabled by default), +allows any \f(CW\*(C`SvPOK\*(C'\fR scalar to be automatically upgraded to a copy-on-write +scalar when copied. A reference count on the string buffer is stored in +the string buffer itself. +.Sp +For example: +.Sp +.Vb 10 +\& $ perl \-MDevel::Peek \-e\*(Aq$a="abc"; $b = $a; Dump $a; Dump $b\*(Aq +\& SV = PV(0x260cd80) at 0x2620ad8 +\& REFCNT = 1 +\& FLAGS = (POK,IsCOW,pPOK) +\& PV = 0x2619bc0 "abc"\e0 +\& CUR = 3 +\& LEN = 16 +\& COW_REFCNT = 1 +\& SV = PV(0x260ce30) at 0x2620b20 +\& REFCNT = 1 +\& FLAGS = (POK,IsCOW,pPOK) +\& PV = 0x2619bc0 "abc"\e0 +\& CUR = 3 +\& LEN = 16 +\& COW_REFCNT = 1 +.Ve +.Sp +Note that both scalars share the same PV buffer and have a COW_REFCNT +greater than zero. +.Sp +This means that XS code which wishes to modify the \f(CWSvPVX()\fR buffer of an +SV should call \f(CWSvPV_force()\fR or similar first, to ensure a valid (and +unshared) buffer, and to call \f(CWSvSETMAGIC()\fR afterwards. This in fact has +always been the case (for example hash keys were already copy-on-write); +this change just spreads the COW behaviour to a wider variety of SVs. +.Sp +One important difference is that before 5.18.0, shared hash-key scalars +used to have the \f(CW\*(C`SvREADONLY\*(C'\fR flag set; this is no longer the case. +.Sp +This new behaviour can still be disabled by running \fIConfigure\fR with +\&\fB\-Accflags=\-DPERL_NO_COW\fR. This option will probably be removed in Perl +5.22. +.IP \(bu 4 +\&\f(CW\*(C`PL_sawampersand\*(C'\fR is now a constant. The switch this variable provided +(to enable/disable the pre-match copy depending on whether \f(CW$&\fR had been +seen) has been removed and replaced with copy-on-write, eliminating a few +bugs. +.Sp +The previous behaviour can still be enabled by running \fIConfigure\fR with +\&\fB\-Accflags=\-DPERL_SAWAMPERSAND\fR. +.IP \(bu 4 +The functions \f(CW\*(C`my_swap\*(C'\fR, \f(CW\*(C`my_htonl\*(C'\fR and \f(CW\*(C`my_ntohl\*(C'\fR have been removed. +It is unclear why these functions were ever marked as \fIA\fR, part of the +API. XS code can't call them directly, as it can't rely on them being +compiled. Unsurprisingly, no code on CPAN references them. +.IP \(bu 4 +The signature of the \f(CWPerl_re_intuit_start()\fR regex function has changed; +the function pointer \f(CW\*(C`intuit\*(C'\fR in the regex engine plugin structure +has also changed accordingly. A new parameter, \f(CW\*(C`strbeg\*(C'\fR has been added; +this has the same meaning as the same-named parameter in +\&\f(CW\*(C`Perl_regexec_flags\*(C'\fR. Previously intuit would try to guess the start of +the string from the passed SV (if any), and would sometimes get it wrong +(e.g. with an overloaded SV). +.IP \(bu 4 +The signature of the \f(CWPerl_regexec_flags()\fR regex function has +changed; the function pointer \f(CW\*(C`exec\*(C'\fR in the regex engine plugin +structure has also changed to match. The \f(CW\*(C`minend\*(C'\fR parameter now has +type \f(CW\*(C`SSize_t\*(C'\fR to better support 64\-bit systems. +.IP \(bu 4 +XS code may use various macros to change the case of a character or code +point (for example \f(CWtoLOWER_utf8()\fR). Only a couple of these were +documented until now; +and now they should be used in preference to calling the underlying +functions. See "Character case changing" in perlapi. +.IP \(bu 4 +The code dealt rather inconsistently with uids and gids. Some +places assumed that they could be safely stored in UVs, others +in IVs, others in ints. Four new macros are introduced: +\&\fBSvUID()\fR, \fBsv_setuid()\fR, \fBSvGID()\fR, and \fBsv_setgid()\fR +.IP \(bu 4 +\&\f(CW\*(C`sv_pos_b2u_flags\*(C'\fR has been added to the API. It is similar to \f(CW\*(C`sv_pos_b2u\*(C'\fR, +but supports long strings on 64\-bit platforms. +.IP \(bu 4 +\&\f(CW\*(C`PL_exit_flags\*(C'\fR can now be used by perl embedders or other XS code to have +perl \f(CW\*(C`warn\*(C'\fR or \f(CW\*(C`abort\*(C'\fR on an attempted exit. [perl #52000] +.IP \(bu 4 +Compiling with \f(CW\*(C`\-Accflags=\-PERL_BOOL_AS_CHAR\*(C'\fR now allows C99 and C++ +compilers to emulate the aliasing of \f(CW\*(C`bool\*(C'\fR to \f(CW\*(C`char\*(C'\fR that perl does for +C89 compilers. [perl #120314] +.IP \(bu 4 +The \f(CW\*(C`sv\*(C'\fR argument in "sv_2pv_flags" in perlapi, "sv_2iv_flags" in perlapi, +"sv_2uv_flags" in perlapi, and "sv_2nv_flags" in perlapi and their older wrappers +sv_2pv, sv_2iv, sv_2uv, sv_2nv, is now non-NULL. Passing NULL now will crash. +When the non-NULL marker was introduced en masse in 5.9.3 the functions +were marked non-NULL, but since the creation of the SV API in 5.0 alpha 2, if +NULL was passed, the functions returned 0 or false-type values. The code that +supports \f(CW\*(C`sv\*(C'\fR argument being non-NULL dates to 5.0 alpha 2 directly, and +indirectly to Perl 1.0 (pre 5.0 api). The lack of documentation that the +functions accepted a NULL \f(CW\*(C`sv\*(C'\fR was corrected in 5.11.0 and between 5.11.0 +and 5.19.5 the functions were marked NULLOK. As an optimization the NULLOK code +has now been removed, and the functions became non-NULL marked again, because +core getter-type macros never pass NULL to these functions and would crash +before ever passing NULL. +.Sp +The only way a NULL \f(CW\*(C`sv\*(C'\fR can be passed to sv_2*v* functions is if XS code +directly calls sv_2*v*. This is unlikely as XS code uses Sv*V* macros to get +the underlying value out of the SV. One possible situation which leads to +a NULL \f(CW\*(C`sv\*(C'\fR being passed to sv_2*v* functions, is if XS code defines its own +getter type Sv*V* macros, which check for NULL \fBbefore\fR dereferencing and +checking the SV's flags through public API Sv*OK* macros or directly using +private API \f(CW\*(C`SvFLAGS\*(C'\fR, and if \f(CW\*(C`sv\*(C'\fR is NULL, then calling the sv_2*v functions +with a NULL literal or passing the \f(CW\*(C`sv\*(C'\fR containing a NULL value. +.IP \(bu 4 +newATTRSUB is now a macro +.Sp +The public API newATTRSUB was previously a macro to the private +function Perl_newATTRSUB. Function Perl_newATTRSUB has been removed. newATTRSUB +is now macro to a different internal function. +.IP \(bu 4 +Changes in warnings raised by \f(CWutf8n_to_uvchr()\fR +.Sp +This bottom level function decodes the first character of a UTF\-8 string +into a code point. It is accessible to \f(CW\*(C`XS\*(C'\fR level code, but it's +discouraged from using it directly. There are higher level functions +that call this that should be used instead, such as +"utf8_to_uvchr_buf" in perlapi. For completeness though, this documents +some changes to it. Now, tests for malformations are done before any +tests for other potential issues. One of those issues involves code +points so large that they have never appeared in any official standard +(the current standard has scaled back the highest acceptable code point +from earlier versions). It is possible (though not done in CPAN) to +warn and/or forbid these code points, while accepting smaller code +points that are still above the legal Unicode maximum. The warning +message for this now includes the code point if representable on the +machine. Previously it always displayed raw bytes, which is what it +still does for non-representable code points. +.IP \(bu 4 +Regexp engine changes that affect the pluggable regex engine interface +.Sp +Many flags that used to be exposed via regexp.h and used to populate the +extflags member of struct regexp have been removed. These fields were +technically private to Perl's own regexp engine and should not have been +exposed there in the first place. +.Sp +The affected flags are: +.Sp +.Vb 8 +\& RXf_NOSCAN +\& RXf_CANY_SEEN +\& RXf_GPOS_SEEN +\& RXf_GPOS_FLOAT +\& RXf_ANCH_BOL +\& RXf_ANCH_MBOL +\& RXf_ANCH_SBOL +\& RXf_ANCH_GPOS +.Ve +.Sp +As well as the follow flag masks: +.Sp +.Vb 2 +\& RXf_ANCH_SINGLE +\& RXf_ANCH +.Ve +.Sp +All have been renamed to PREGf_ equivalents and moved to regcomp.h. +.Sp +The behavior previously achieved by setting one or more of the RXf_ANCH_ +flags (via the RXf_ANCH mask) have now been replaced by a *single* flag bit +in extflags: +.Sp +.Vb 1 +\& RXf_IS_ANCHORED +.Ve +.Sp +pluggable regex engines which previously used to set these flags should +now set this flag ALONE. +.IP \(bu 4 +The Perl core now consistently uses \f(CWav_tindex()\fR ("the top index of an +array") as a more clearly-named synonym for \f(CWav_len()\fR. +.IP \(bu 4 +The obscure interpreter variable \f(CW\*(C`PL_timesbuf\*(C'\fR is expected to be removed +early in the 5.21.x development series, so that Perl 5.22.0 will not provide +it to XS authors. While the variable still exists in 5.20.0, we hope that +this advance warning of the deprecation will help anyone who is using that +variable. +.SH "Selected Bug Fixes" +.IX Header "Selected Bug Fixes" +.SS "Regular Expressions" +.IX Subsection "Regular Expressions" +.IP \(bu 4 +Fixed a small number of regexp constructions that could either fail to +match or crash perl when the string being matched against was +allocated above the 2GB line on 32\-bit systems. [RT #118175] +.IP \(bu 4 +Various memory leaks involving the parsing of the \f(CW\*(C`(?[...])\*(C'\fR regular +expression construct have been fixed. +.IP \(bu 4 +\&\f(CW\*(C`(?[...])\*(C'\fR now allows interpolation of precompiled patterns consisting of +\&\f(CW\*(C`(?[...])\*(C'\fR with bracketed character classes inside (\f(CW\*(C`$pat = +qr/(?[\ [a]\ ])/; /(?[\ $pat\ ])/\*(C'\fR). Formerly, the brackets would +confuse the regular expression parser. +.IP \(bu 4 +The "Quantifier unexpected on zero-length expression" warning message could +appear twice starting in Perl v5.10 for a regular expression also +containing alternations (e.g., "a|b") triggering the trie optimisation. +.IP \(bu 4 +Perl v5.18 inadvertently introduced a bug whereby interpolating mixed up\- +and down-graded UTF\-8 strings in a regex could result in malformed UTF\-8 +in the pattern: specifically if a downgraded character in the range +\&\f(CW\*(C`\ex80..\exff\*(C'\fR followed a UTF\-8 string, e.g. +.Sp +.Vb 3 +\& utf8::upgrade( my $u = "\ex{e5}"); +\& utf8::downgrade(my $d = "\ex{e5}"); +\& /$u$d/ +.Ve +.Sp +[RT #118297] +.IP \(bu 4 +In regular expressions containing multiple code blocks, the values of +\&\f(CW$1\fR, \f(CW$2\fR, etc., set by nested regular expression calls would leak from +one block to the next. Now these variables always refer to the outer +regular expression at the start of an embedded block [perl #117917]. +.IP \(bu 4 +\&\f(CW\*(C`/$qr/p\*(C'\fR was broken in Perl 5.18.0; the \f(CW\*(C`/p\*(C'\fR flag was ignored. This has been +fixed. [perl #118213] +.IP \(bu 4 +Starting in Perl 5.18.0, a construct like \f(CW\*(C`/[#](?{})/x\*(C'\fR would have its \f(CW\*(C`#\*(C'\fR +incorrectly interpreted as a comment. The code block would be skipped, +unparsed. This has been corrected. +.IP \(bu 4 +Starting in Perl 5.001, a regular expression like \f(CW\*(C`/[#$a]/x\*(C'\fR or \f(CW\*(C`/[#]$a/x\*(C'\fR +would have its \f(CW\*(C`#\*(C'\fR incorrectly interpreted as a comment, so the variable would +not interpolate. This has been corrected. [perl #45667] +.IP \(bu 4 +Perl 5.18.0 inadvertently made dereferenced regular expressions +(\f(CW\*(C`${\ qr//\ }\*(C'\fR) false as booleans. This has been fixed. +.IP \(bu 4 +The use of \f(CW\*(C`\eG\*(C'\fR in regular expressions, where it's not at the start of the +pattern, is now slightly less buggy (although it is still somewhat +problematic). +.IP \(bu 4 +Where a regular expression included code blocks (\f(CW\*(C`/(?{...})/\*(C'\fR), and where the +use of constant overloading triggered a re-compilation of the code block, the +second compilation didn't see its outer lexical scope. This was a regression +in Perl 5.18.0. +.IP \(bu 4 +The string position set by \f(CW\*(C`pos\*(C'\fR could shift if the string changed +representation internally to or from utf8. This could happen, e.g., with +references to objects with string overloading. +.IP \(bu 4 +Taking references to the return values of two \f(CW\*(C`pos\*(C'\fR calls with the same +argument, and then assigning a reference to one and \f(CW\*(C`undef\*(C'\fR to the other, +could result in assertion failures or memory leaks. +.IP \(bu 4 +Elements of @\- and @+ now update correctly when they refer to non-existent +captures. Previously, a referenced element (\f(CW\*(C`$ref = \e$\-[1]\*(C'\fR) could refer to +the wrong match after subsequent matches. +.IP \(bu 4 +The code that parses regex backrefs (or ambiguous backref/octals) such as \e123 +did a simple \fBatoi()\fR, which could wrap round to negative values on long digit +strings and cause segmentation faults. This has now been fixed. [perl +#119505] +.IP \(bu 4 +Assigning another typeglob to \f(CW\*(C`*^R\*(C'\fR no longer makes the regular expression +engine crash. +.IP \(bu 4 +The \f(CW\*(C`\eN\*(C'\fR regular expression escape, when used without the curly braces (to +mean \f(CW\*(C`[^\en]\*(C'\fR), was ignoring a following \f(CW\*(C`*\*(C'\fR if followed by whitespace +under /x. It had been this way since \f(CW\*(C`\eN\*(C'\fR to mean \f(CW\*(C`[^\en]\*(C'\fR was introduced +in 5.12.0. +.IP \(bu 4 +\&\f(CW\*(C`s///\*(C'\fR, \f(CW\*(C`tr///\*(C'\fR and \f(CW\*(C`y///\*(C'\fR now work when a wide character is used as the +delimiter. [perl #120463] +.IP \(bu 4 +Some cases of unterminated (?...) sequences in regular expressions (e.g., +\&\f(CW\*(C`/(?</\*(C'\fR) have been fixed to produce the proper error message instead of +"panic: memory wrap". Other cases (e.g., \f(CW\*(C`/(?(/\*(C'\fR) have yet to be fixed. +.IP \(bu 4 +When a reference to a reference to an overloaded object was returned from +a regular expression \f(CW\*(C`(??{...})\*(C'\fR code block, an incorrect implicit +dereference could take place if the inner reference had been returned by +a code block previously. +.IP \(bu 4 +A tied variable returned from \f(CW\*(C`(??{...})\*(C'\fR sees the inner values of match +variables (i.e., the \f(CW$1\fR etc. from any matches inside the block) in its +FETCH method. This was not the case if a reference to an overloaded object +was the last thing assigned to the tied variable. Instead, the match +variables referred to the outer pattern during the FETCH call. +.IP \(bu 4 +Fix unexpected tainting via regexp using locale. Previously, under certain +conditions, the use of character classes could cause tainting when it +shouldn't. Some character classes are locale-dependent, but before this +patch, sometimes tainting was happening even for character classes that +don't depend on the locale. [perl #120675] +.IP \(bu 4 +Under certain conditions, Perl would throw an error if in a lookbehind +assertion in a regexp, the assertion referred to a named subpattern, +complaining the lookbehind was variable when it wasn't. This has been +fixed. [perl #120600], [perl #120618]. The current fix may be improved +on in the future. +.IP \(bu 4 +\&\f(CW$^R\fR wasn't available outside of the regular expression that +initialized it. [perl #121070] +.IP \(bu 4 +A large set of fixes and refactoring for \fBre_intuit_start()\fR was merged, +the highlights are: +.RS 4 +.IP \(bu 4 +Fixed a panic when compiling the regular expression +\&\f(CW\*(C`/\ex{100}[xy]\ex{100}{2}/\*(C'\fR. +.IP \(bu 4 +Fixed a performance regression when performing a global pattern match +against a UTF\-8 string. [perl #120692] +.IP \(bu 4 +Fixed another performance issue where matching a regular expression +like \f(CW\*(C`/ab.{1,2}x/\*(C'\fR against a long UTF\-8 string would unnecessarily +calculate byte offsets for a large portion of the string. [perl +#120692] +.RE +.RS 4 +.RE +.IP \(bu 4 +Fixed an alignment error when compiling regular expressions when built +with GCC on HP-UX 64\-bit. +.IP \(bu 4 +On 64\-bit platforms \f(CW\*(C`pos\*(C'\fR can now be set to a value higher than 2**31\-1. +[perl #72766] +.SS "Perl 5 Debugger and \-d" +.IX Subsection "Perl 5 Debugger and -d" +.IP \(bu 4 +The debugger's \f(CW\*(C`man\*(C'\fR command been fixed. It was broken in the v5.18.0 +release. The \f(CW\*(C`man\*(C'\fR command is aliased to the names \f(CW\*(C`doc\*(C'\fR and \f(CW\*(C`perldoc\*(C'\fR \- +all now work again. +.IP \(bu 4 +\&\f(CW@_\fR is now correctly visible in the debugger, fixing a regression +introduced in v5.18.0's debugger. [RT #118169] +.IP \(bu 4 +Under copy-on-write builds (the default as of 5.20.0) \f(CW\*(C`${\*(Aq_<\-e\*(Aq}[0]\*(C'\fR +no longer gets mangled. This is the first line of input saved for the +debugger's use for one-liners [perl #118627]. +.IP \(bu 4 +On non-threaded builds, setting \f(CW\*(C`${"_<filename"}\*(C'\fR to a reference or +typeglob no longer causes \f(CW\*(C`_\|_FILE_\|_\*(C'\fR and some error messages to produce a +corrupt string, and no longer prevents \f(CW\*(C`#line\*(C'\fR directives in string evals from +providing the source lines to the debugger. Threaded builds were unaffected. +.IP \(bu 4 +Starting with Perl 5.12, line numbers were off by one if the \fB\-d\fR switch was +used on the #! line. Now they are correct. +.IP \(bu 4 +\&\f(CW\*(C`*DB::DB = sub {} if 0\*(C'\fR no longer stops Perl's debugging mode from finding +\&\f(CW\*(C`DB::DB\*(C'\fR subs declared thereafter. +.IP \(bu 4 +\&\f(CW\*(C`%{\*(Aq_<...\*(Aq}\*(C'\fR hashes now set breakpoints on the corresponding \f(CW\*(C`@{\*(Aq_<...\*(Aq}\*(C'\fR +rather than whichever array \f(CW@DB::dbline\fR is aliased to. [perl #119799] +.IP \(bu 4 +Call set-magic when setting \f(CW$DB::sub\fR. [perl #121255] +.IP \(bu 4 +The debugger's "n" command now respects lvalue subroutines and steps over +them [perl #118839]. +.SS "Lexical Subroutines" +.IX Subsection "Lexical Subroutines" +.IP \(bu 4 +Lexical constants (\f(CW\*(C`my sub a() { 42 }\*(C'\fR) no longer crash when inlined. +.IP \(bu 4 +Parameter prototypes attached to lexical subroutines are now respected when +compiling sub calls without parentheses. Previously, the prototypes were +honoured only for calls \fIwith\fR parentheses. [RT #116735] +.IP \(bu 4 +Syntax errors in lexical subroutines in combination with calls to the same +subroutines no longer cause crashes at compile time. +.IP \(bu 4 +Deep recursion warnings no longer crash lexical subroutines. [RT #118521] +.IP \(bu 4 +The dtrace sub-entry probe now works with lexical subs, instead of +crashing [perl #118305]. +.IP \(bu 4 +Undefining an inlinable lexical subroutine (\f(CWmy sub foo() { 42 } undef +&foo\fR) would result in a crash if warnings were turned on. +.IP \(bu 4 +An undefined lexical sub used as an inherited method no longer crashes. +.IP \(bu 4 +The presence of a lexical sub named "CORE" no longer stops the CORE:: +prefix from working. +.SS "Everything Else" +.IX Subsection "Everything Else" +.IP \(bu 4 +The OP allocation code now returns correctly aligned memory in all cases +for \f(CW\*(C`struct pmop\*(C'\fR. Previously it could return memory only aligned to a +4\-byte boundary, which is not correct for an ithreads build with 64 bit IVs +on some 32 bit platforms. Notably, this caused the build to fail completely +on sparc GNU/Linux. [RT #118055] +.IP \(bu 4 +Evaluating large hashes in scalar context is now much faster, as the number +of used chains in the hash is now cached for larger hashes. Smaller hashes +continue not to store it and calculate it when needed, as this saves one IV. +That would be 1 IV overhead for every object built from a hash. [RT #114576] +.IP \(bu 4 +Perl v5.16 inadvertently introduced a bug whereby calls to XSUBs that were +not visible at compile time were treated as lvalues and could be assigned +to, even when the subroutine was not an lvalue sub. This has been fixed. +[RT #117947] +.IP \(bu 4 +In Perl v5.18.0 dualvars that had an empty string for the string part but a +non-zero number for the number part starting being treated as true. In +previous versions they were treated as false, the string representation +taking precedence. The old behaviour has been restored. [RT #118159] +.IP \(bu 4 +Since Perl v5.12, inlining of constants that override built-in keywords of +the same name had countermanded \f(CW\*(C`use subs\*(C'\fR, causing subsequent mentions of +the constant to use the built-in keyword instead. This has been fixed. +.IP \(bu 4 +The warning produced by \f(CW\*(C`\-l $handle\*(C'\fR now applies to IO refs and globs, not +just to glob refs. That warning is also now UTF8\-clean. [RT #117595] +.IP \(bu 4 +\&\f(CW\*(C`delete local $ENV{nonexistent_env_var}\*(C'\fR no longer leaks memory. +.IP \(bu 4 +\&\f(CW\*(C`sort\*(C'\fR and \f(CW\*(C`require\*(C'\fR followed by a keyword prefixed with \f(CW\*(C`CORE::\*(C'\fR now +treat it as a keyword, and not as a subroutine or module name. [RT #24482] +.IP \(bu 4 +Through certain conundrums, it is possible to cause the current package to +be freed. Certain operators (\f(CW\*(C`bless\*(C'\fR, \f(CW\*(C`reset\*(C'\fR, \f(CW\*(C`open\*(C'\fR, \f(CW\*(C`eval\*(C'\fR) could +not cope and would crash. They have been made more resilient. [RT #117941] +.IP \(bu 4 +Aliasing filehandles through glob-to-glob assignment would not update +internal method caches properly if a package of the same name as the +filehandle existed, resulting in filehandle method calls going to the +package instead. This has been fixed. +.IP \(bu 4 +\&\f(CW\*(C`./Configure \-de \-Dusevendorprefix\*(C'\fR didn't default. [RT #64126] +.IP \(bu 4 +The \f(CW\*(C`Statement unlikely to be reached\*(C'\fR warning was listed in +perldiag as an \f(CW\*(C`exec\*(C'\fR\-category warning, but was enabled and disabled +by the \f(CW\*(C`syntax\*(C'\fR category. On the other hand, the \f(CW\*(C`exec\*(C'\fR category +controlled its fatal-ness. It is now entirely handled by the \f(CW\*(C`exec\*(C'\fR +category. +.IP \(bu 4 +The "Replacement list is longer that search list" warning for \f(CW\*(C`tr///\*(C'\fR and +\&\f(CW\*(C`y///\*(C'\fR no longer occurs in the presence of the \f(CW\*(C`/c\*(C'\fR flag. [RT #118047] +.IP \(bu 4 +Stringification of NVs are not cached so that the lexical locale controls +stringification of the decimal point. [perl #108378] [perl #115800] +.IP \(bu 4 +There have been several fixes related to Perl's handling of locales. perl +#38193 was described above in "Internal Changes". +Also fixed is +#118197, where the radix (decimal point) character had to be an ASCII +character (which doesn't work for some non-Western languages); +and #115808, in which \f(CWPOSIX::setlocale()\fR on failure returned an +\&\f(CW\*(C`undef\*(C'\fR which didn't warn about not being defined even if those +warnings were enabled. +.IP \(bu 4 +Compiling a \f(CW\*(C`split\*(C'\fR operator whose third argument is a named constant +evaluating to 0 no longer causes the constant's value to change. +.IP \(bu 4 +A named constant used as the second argument to \f(CW\*(C`index\*(C'\fR no longer gets +coerced to a string if it is a reference, regular expression, dualvar, etc. +.IP \(bu 4 +A named constant evaluating to the undefined value used as the second +argument to \f(CW\*(C`index\*(C'\fR no longer produces "uninitialized" warnings at compile +time. It will still produce them at run time. +.IP \(bu 4 +When a scalar was returned from a subroutine in \f(CW@INC\fR, the referenced scalar +was magically converted into an IO thingy, possibly resulting in "Bizarre +copy" errors if that scalar continued to be used elsewhere. Now Perl uses +an internal copy of the scalar instead. +.IP \(bu 4 +Certain uses of the \f(CW\*(C`sort\*(C'\fR operator are optimised to modify an array in +place, such as \f(CW\*(C`@a = sort @a\*(C'\fR. During the sorting, the array is made +read-only. If a sort block should happen to die, then the array remained +read-only even outside the \f(CW\*(C`sort\*(C'\fR. This has been fixed. +.IP \(bu 4 +\&\f(CW$a\fR and \f(CW$b\fR inside a sort block are aliased to the actual arguments to +\&\f(CW\*(C`sort\*(C'\fR, so they can be modified through those two variables. This did not +always work, e.g., for lvalue subs and \f(CW$#ary\fR, and probably many other +operators. It works now. +.IP \(bu 4 +The arguments to \f(CW\*(C`sort\*(C'\fR are now all in list context. If the \f(CW\*(C`sort\*(C'\fR +itself were called in void or scalar context, then \fIsome\fR, but not all, of +the arguments used to be in void or scalar context. +.IP \(bu 4 +Subroutine prototypes with Unicode characters above U+00FF were getting +mangled during closure cloning. This would happen with subroutines closing +over lexical variables declared outside, and with lexical subs. +.IP \(bu 4 +\&\f(CW\*(C`UNIVERSAL::can\*(C'\fR now treats its first argument the same way that method +calls do: Typeglobs and glob references with non-empty IO slots are treated +as handles, and strings are treated as filehandles, rather than packages, +if a handle with that name exists [perl #113932]. +.IP \(bu 4 +Method calls on typeglobs (e.g., \f(CW\*(C`*ARGV\->getline\*(C'\fR) used to stringify +the typeglob and then look it up again. Combined with changes in Perl +5.18.0, this allowed \f(CW\*(C`*foo\->bar\*(C'\fR to call methods on the "foo" package +(like \f(CW\*(C`foo\->bar\*(C'\fR). In some cases it could cause the method to be +called on the wrong handle. Now a typeglob argument is treated as a +handle (just like \f(CW\*(C`(\e*foo)\->bar\*(C'\fR), or, if its IO slot is empty, an +error is raised. +.IP \(bu 4 +Assigning a vstring to a tied variable or to a subroutine argument aliased +to a nonexistent hash or array element now works, without flattening the +vstring into a regular string. +.IP \(bu 4 +\&\f(CW\*(C`pos\*(C'\fR, \f(CW\*(C`tie\*(C'\fR, \f(CW\*(C`tied\*(C'\fR and \f(CW\*(C`untie\*(C'\fR did not work +properly on subroutine arguments aliased to nonexistent +hash and array elements [perl #77814, #27010]. +.IP \(bu 4 +The \f(CW\*(C`=>\*(C'\fR fat arrow operator can now quote built-in keywords even if it +occurs on the next line, making it consistent with how it treats other +barewords. +.IP \(bu 4 +Autovivifying a subroutine stub via \f(CW\*(C`\e&$glob\*(C'\fR started causing crashes in Perl +5.18.0 if the \f(CW$glob\fR was merely a copy of a real glob, i.e., a scalar that had +had a glob assigned to it. This has been fixed. [perl #119051] +.IP \(bu 4 +Perl used to leak an implementation detail when it came to referencing the +return values of certain operators. \f(CW\*(C`for ($a+$b) { warn \e$_; warn \e$_ }\*(C'\fR used +to display two different memory addresses, because the \f(CW\*(C`\e\*(C'\fR operator was +copying the variable. Under threaded builds, it would also happen for +constants (\f(CW\*(C`for(1) { ... }\*(C'\fR). This has been fixed. [perl #21979, #78194, +#89188, #109746, #114838, #115388] +.IP \(bu 4 +The range operator \f(CW\*(C`..\*(C'\fR was returning the same modifiable scalars with each +call, unless it was the only thing in a \f(CW\*(C`foreach\*(C'\fR loop header. This meant +that changes to values within the list returned would be visible the next time +the operator was executed. [perl #3105] +.IP \(bu 4 +Constant folding and subroutine inlining no longer cause operations that would +normally return new modifiable scalars to return read-only values instead. +.IP \(bu 4 +Closures of the form \f(CW\*(C`sub () { $some_variable }\*(C'\fR are no longer inlined, +causing changes to the variable to be ignored by callers of the subroutine. +[perl #79908] +.IP \(bu 4 +Return values of certain operators such as \f(CW\*(C`ref\*(C'\fR would sometimes be shared +between recursive calls to the same subroutine, causing the inner call to +modify the value returned by \f(CW\*(C`ref\*(C'\fR in the outer call. This has been fixed. +.IP \(bu 4 +\&\f(CW\*(C`_\|_PACKAGE_\|_\*(C'\fR and constants returning a package name or hash key are now +consistently read-only. In various previous Perl releases, they have become +mutable under certain circumstances. +.IP \(bu 4 +Enabling "used once" warnings no longer causes crashes on stash circularities +created at compile time (\f(CW\*(C`*Foo::Bar::Foo:: = *Foo::\*(C'\fR). +.IP \(bu 4 +Undef constants used in hash keys (\f(CW\*(C`use constant u => undef; $h{+u}\*(C'\fR) no +longer produce "uninitialized" warnings at compile time. +.IP \(bu 4 +Modifying a substitution target inside the substitution replacement no longer +causes crashes. +.IP \(bu 4 +The first statement inside a string eval used to use the wrong pragma setting +sometimes during constant folding. \f(CW\*(C`eval \*(Aquc chr 0xe0\*(Aq\*(C'\fR would randomly choose +between Unicode, byte, and locale semantics. This has been fixed. +.IP \(bu 4 +The handling of return values of \f(CW@INC\fR filters (subroutines returned by +subroutines in \f(CW@INC\fR) has been fixed in various ways. Previously tied variables +were mishandled, and setting \f(CW$_\fR to a reference or typeglob could result in +crashes. +.IP \(bu 4 +The \f(CW\*(C`SvPVbyte\*(C'\fR XS function has been fixed to work with tied scalars returning +something other than a string. It used to return utf8 in those cases where +\&\f(CW\*(C`SvPV\*(C'\fR would. +.IP \(bu 4 +Perl 5.18.0 inadvertently made \f(CW\*(C`\-\-\*(C'\fR and \f(CW\*(C`++\*(C'\fR crash on dereferenced regular +expressions, and stopped \f(CW\*(C`++\*(C'\fR from flattening vstrings. +.IP \(bu 4 +\&\f(CW\*(C`bless\*(C'\fR no longer dies with "Can't bless non-reference value" if its first +argument is a tied reference. +.IP \(bu 4 +\&\f(CW\*(C`reset\*(C'\fR with an argument no longer skips copy-on-write scalars, regular +expressions, typeglob copies, and vstrings. Also, when encountering those or +read-only values, it no longer skips any array or hash with the same name. +.IP \(bu 4 +\&\f(CW\*(C`reset\*(C'\fR with an argument now skips scalars aliased to typeglobs +(\f(CW\*(C`for $z (*foo) { reset "z" }\*(C'\fR). Previously it would corrupt memory or crash. +.IP \(bu 4 +\&\f(CW\*(C`ucfirst\*(C'\fR and \f(CW\*(C`lcfirst\*(C'\fR were not respecting the bytes pragma. This was a +regression from Perl 5.12. [perl #117355] +.IP \(bu 4 +Changes to \f(CW\*(C`UNIVERSAL::DESTROY\*(C'\fR now update DESTROY caches in all classes, +instead of causing classes that have already had objects destroyed to continue +using the old sub. This was a regression in Perl 5.18. [perl #114864] +.IP \(bu 4 +All known false-positive occurrences of the deprecation warning "Useless use of +\&'\e'; doesn't escape metacharacter '%c'", added in Perl 5.18.0, have been +removed. [perl #119101] +.IP \(bu 4 +The value of $^E is now saved across signal handlers on Windows. [perl #85104] +.IP \(bu 4 +A lexical filehandle (as in \f(CW\*(C`open my $fh...\*(C'\fR) is usually given a name based on +the current package and the name of the variable, e.g. "main::$fh". Under +recursion, the filehandle was losing the "$fh" part of the name. This has been +fixed. +.IP \(bu 4 +Uninitialized values returned by XSUBs are no longer exempt from uninitialized +warnings. [perl #118693] +.IP \(bu 4 +\&\f(CW\*(C`elsif ("")\*(C'\fR no longer erroneously produces a warning about void context. +[perl #118753] +.IP \(bu 4 +Passing \f(CW\*(C`undef\*(C'\fR to a subroutine now causes \f(CW@_\fR to contain the same read-only +undefined scalar that \f(CW\*(C`undef\*(C'\fR returns. Furthermore, \f(CW\*(C`exists $_[0]\*(C'\fR will now +return true if \f(CW\*(C`undef\*(C'\fR was the first argument. [perl #7508, #109726] +.IP \(bu 4 +Passing a non-existent array element to a subroutine does not usually +autovivify it unless the subroutine modifies its argument. This did not work +correctly with negative indices and with non-existent elements within the +array. The element would be vivified immediately. The delayed vivification +has been extended to work with those. [perl #118691] +.IP \(bu 4 +Assigning references or globs to the scalar returned by $#foo after the \f(CW@foo\fR +array has been freed no longer causes assertion failures on debugging builds +and memory leaks on regular builds. +.IP \(bu 4 +On 64\-bit platforms, large ranges like 1..1000000000000 no longer crash, but +eat up all your memory instead. [perl #119161] +.IP \(bu 4 +\&\f(CW\*(C`_\|_DATA_\|_\*(C'\fR now puts the \f(CW\*(C`DATA\*(C'\fR handle in the right package, even if the +current package has been renamed through glob assignment. +.IP \(bu 4 +When \f(CW\*(C`die\*(C'\fR, \f(CW\*(C`last\*(C'\fR, \f(CW\*(C`next\*(C'\fR, \f(CW\*(C`redo\*(C'\fR, \f(CW\*(C`goto\*(C'\fR and \f(CW\*(C`exit\*(C'\fR unwind the scope, +it is possible for \f(CW\*(C`DESTROY\*(C'\fR recursively to call a subroutine or format that +is currently being exited. It that case, sometimes the lexical variables +inside the sub would start out having values from the outer call, instead of +being undefined as they should. This has been fixed. [perl #119311] +.IP \(bu 4 +${^MPEN} is no longer treated as a synonym for ${^MATCH}. +.IP \(bu 4 +Perl now tries a little harder to return the correct line number in +\&\f(CW\*(C`(caller)[2]\*(C'\fR. [perl #115768] +.IP \(bu 4 +Line numbers inside multiline quote-like operators are now reported correctly. +[perl #3643] +.IP \(bu 4 +\&\f(CW\*(C`#line\*(C'\fR directives inside code embedded in quote-like operators are now +respected. +.IP \(bu 4 +Line numbers are now correct inside the second here-doc when two here-doc +markers occur on the same line. +.IP \(bu 4 +An optimization in Perl 5.18 made incorrect assumptions causing a bad +interaction with the Devel::CallParser CPAN module. If the module was +loaded then lexical variables declared in separate statements following a +\&\f(CWmy(...)\fR list might fail to be cleared on scope exit. +.IP \(bu 4 +\&\f(CW&xsub\fR and \f(CW\*(C`goto &xsub\*(C'\fR calls now allow the called subroutine to autovivify +elements of \f(CW@_\fR. +.IP \(bu 4 +\&\f(CW&xsub\fR and \f(CW\*(C`goto &xsub\*(C'\fR no longer crash if *_ has been undefined and has no +ARRAY entry (i.e. \f(CW@_\fR does not exist). +.IP \(bu 4 +\&\f(CW&xsub\fR and \f(CW\*(C`goto &xsub\*(C'\fR now work with tied \f(CW@_\fR. +.IP \(bu 4 +Overlong identifiers no longer cause a buffer overflow (and a crash). They +started doing so in Perl 5.18. +.IP \(bu 4 +The warning "Scalar value \f(CW@hash\fR{foo} better written as \f(CW$hash\fR{foo}" now produces +far fewer false positives. In particular, \f(CW@hash{+function_returning_a_list}\fR +and \f(CW@hash{ qw "foo bar baz" }\fR no longer warn. The same applies to array +slices. [perl #28380, #114024] +.IP \(bu 4 +\&\f(CW\*(C`$! = EINVAL; waitpid(0, WNOHANG);\*(C'\fR no longer goes into an internal infinite +loop. [perl #85228] +.IP \(bu 4 +A possible segmentation fault in filehandle duplication has been fixed. +.IP \(bu 4 +A subroutine in \f(CW@INC\fR can return a reference to a scalar containing the initial +contents of the file. However, that scalar was freed prematurely if not +referenced elsewhere, giving random results. +.IP \(bu 4 +\&\f(CW\*(C`last\*(C'\fR no longer returns values that the same statement has accumulated so +far, fixing amongst other things the long-standing bug that \f(CW\*(C`push @a, last\*(C'\fR +would try to return the \f(CW@a\fR, copying it like a scalar in the process and +resulting in the error, "Bizarre copy of ARRAY in last." [perl #3112] +.IP \(bu 4 +In some cases, closing file handles opened to pipe to or from a process, which +had been duplicated into a standard handle, would call perl's internal waitpid +wrapper with a pid of zero. With the fix for [perl #85228] this zero pid was +passed to \f(CW\*(C`waitpid\*(C'\fR, possibly blocking the process. This wait for process +zero no longer occurs. [perl #119893] +.IP \(bu 4 +\&\f(CW\*(C`select\*(C'\fR used to ignore magic on the fourth (timeout) argument, leading to +effects such as \f(CW\*(C`select\*(C'\fR blocking indefinitely rather than the expected sleep +time. This has now been fixed. [perl #120102] +.IP \(bu 4 +The class name in \f(CW\*(C`for my class $foo\*(C'\fR is now parsed correctly. In the case of +the second character of the class name being followed by a digit (e.g. 'a1b') +this used to give the error "Missing $ on loop variable". [perl #120112] +.IP \(bu 4 +Perl 5.18.0 accidentally disallowed \f(CW\*(C`\-bareword\*(C'\fR under \f(CW\*(C`use strict\*(C'\fR and +\&\f(CW\*(C`use integer\*(C'\fR. This has been fixed. [perl #120288] +.IP \(bu 4 +\&\f(CW\*(C`\-a\*(C'\fR at the start of a line (or a hyphen with any single letter that is +not a filetest operator) no longer produces an erroneous 'Use of "\-a" +without parentheses is ambiguous' warning. [perl #120288] +.IP \(bu 4 +Lvalue context is now properly propagated into bare blocks and \f(CW\*(C`if\*(C'\fR and +\&\f(CW\*(C`else\*(C'\fR blocks in lvalue subroutines. Previously, arrays and hashes would +sometimes incorrectly be flattened when returned in lvalue list context, or +"Bizarre copy" errors could occur. [perl #119797] +.IP \(bu 4 +Lvalue context is now propagated to the branches of \f(CW\*(C`||\*(C'\fR and \f(CW\*(C`&&\*(C'\fR (and +their alphabetic equivalents, \f(CW\*(C`or\*(C'\fR and \f(CW\*(C`and\*(C'\fR). This means +\&\f(CW\*(C`foreach (pos $x || pos $y) {...}\*(C'\fR now allows \f(CW\*(C`pos\*(C'\fR to be modified +through \f(CW$_\fR. +.IP \(bu 4 +\&\f(CW\*(C`stat\*(C'\fR and \f(CW\*(C`readline\*(C'\fR remember the last handle used; the former +for the special \f(CW\*(C`_\*(C'\fR filehandle, the latter for \f(CW\*(C`${^LAST_FH}\*(C'\fR. +\&\f(CW\*(C`eval "*foo if 0"\*(C'\fR where *foo was the last handle passed to \f(CW\*(C`stat\*(C'\fR +or \f(CW\*(C`readline\*(C'\fR could cause that handle to be forgotten if the +handle were not opened yet. This has been fixed. +.IP \(bu 4 +Various cases of \f(CW\*(C`delete $::{a}\*(C'\fR, \f(CW\*(C`delete $::{ENV}\*(C'\fR etc. causing a crash +have been fixed. [perl #54044] +.IP \(bu 4 +Setting \f(CW$!\fR to EACCESS before calling \f(CW\*(C`require\*(C'\fR could affect +\&\f(CW\*(C`require\*(C'\fR's behaviour. This has been fixed. +.IP \(bu 4 +The "Can't use \e1 to mean \f(CW$1\fR in expression" warning message now only occurs +on the right-hand (replacement) part of a substitution. Formerly it could +happen in code embedded in the left-hand side, or in any other quote-like +operator. +.IP \(bu 4 +Blessing into a reference (\f(CW\*(C`bless $thisref, $thatref\*(C'\fR) has long been +disallowed, but magical scalars for the second like \f(CW$/\fR and those tied +were exempt. They no longer are. [perl #119809] +.IP \(bu 4 +Blessing into a reference was accidentally allowed in 5.18 if the class +argument were a blessed reference with stale method caches (i.e., whose +class had had subs defined since the last method call). They are +disallowed once more, as in 5.16. +.IP \(bu 4 +\&\f(CW\*(C`$x\->{key}\*(C'\fR where \f(CW$x\fR was declared as \f(CW\*(C`my Class $x\*(C'\fR no longer crashes +if a Class::FIELDS subroutine stub has been declared. +.IP \(bu 4 +\&\f(CW@$obj{\*(Aqkey\*(Aq}\fR and \f(CW\*(C`${$obj}{key}\*(C'\fR used to be exempt from compile-time +field checking ("No such class field"; see fields) but no longer are. +.IP \(bu 4 +A nonexistent array element with a large index passed to a subroutine that +ties the array and then tries to access the element no longer results in a +crash. +.IP \(bu 4 +Declaring a subroutine stub named NEGATIVE_INDICES no longer makes negative +array indices crash when the current package is a tied array class. +.IP \(bu 4 +Declaring a \f(CW\*(C`require\*(C'\fR, \f(CW\*(C`glob\*(C'\fR, or \f(CW\*(C`do\*(C'\fR subroutine stub in the +CORE::GLOBAL:: package no longer makes compilation of calls to the +corresponding functions crash. +.IP \(bu 4 +Aliasing CORE::GLOBAL:: functions to constants stopped working in Perl 5.10 +but has now been fixed. +.IP \(bu 4 +When \f(CW\`...\`\fR or \f(CW\*(C`qx/.../\*(C'\fR calls a \f(CW\*(C`readpipe\*(C'\fR override, double-quotish +interpolation now happens, as is the case when there is no override. +Previously, the presence of an override would make these quote-like +operators act like \f(CW\*(C`q{}\*(C'\fR, suppressing interpolation. [perl #115330] +.IP \(bu 4 +\&\f(CW\*(C`<<<\`...\`\*(C'\fR here-docs (with backticks as the delimiters) now call +\&\f(CW\*(C`readpipe\*(C'\fR overrides. [perl #119827] +.IP \(bu 4 +\&\f(CW&CORE::exit()\fR and \f(CW&CORE::die()\fR now respect vmsish hints. +.IP \(bu 4 +Undefining a glob that triggers a DESTROY method that undefines the same +glob is now safe. It used to produce "Attempt to free unreferenced glob +pointer" warnings and leak memory. +.IP \(bu 4 +If subroutine redefinition (\f(CW\*(C`eval \*(Aqsub foo{}\*(Aq\*(C'\fR or \f(CW\*(C`newXS\*(C'\fR for XS code) +triggers a DESTROY method on the sub that is being redefined, and that +method assigns a subroutine to the same slot (\f(CW\*(C`*foo = sub {}\*(C'\fR), \f(CW$_[0]\fR +is no longer left pointing to a freed scalar. Now DESTROY is delayed until +the new subroutine has been installed. +.IP \(bu 4 +On Windows, perl no longer calls \fBCloseHandle()\fR on a socket handle. This makes +debugging easier on Windows by removing certain irrelevant bad handle +exceptions. It also fixes a race condition that made socket functions randomly +fail in a Perl process with multiple OS threads, and possible test failures in +\&\fIdist/IO/t/cachepropagate\-tcp.t\fR. [perl #120091/118059] +.IP \(bu 4 +Formats involving UTF\-8 encoded strings, or strange vars like ties, +overloads, or stringified refs (and in recent +perls, pure NOK vars) would generally do the wrong thing in formats +when the var is treated as a string and repeatedly chopped, as in +\&\f(CW\*(C`^<<<~~\*(C'\fR and similar. This has now been resolved. +[perl #33832/45325/113868/119847/119849/119851] +.IP \(bu 4 +\&\f(CW\*(C`semctl(..., SETVAL, ...)\*(C'\fR would set the semaphore to the top +32\-bits of the supplied integer instead of the bottom 32\-bits on +64\-bit big-endian systems. [perl #120635] +.IP \(bu 4 +\&\f(CWreaddir()\fR now only sets \f(CW$!\fR on error. \f(CW$!\fR is no longer set +to \f(CW\*(C`EBADF\*(C'\fR when then terminating \f(CW\*(C`undef\*(C'\fR is read from the directory +unless the system call sets \f(CW$!\fR. [perl #118651] +.IP \(bu 4 +\&\f(CW&CORE::glob\fR no longer causes an intermittent crash due to perl's stack +getting corrupted. [perl #119993] +.IP \(bu 4 +\&\f(CW\*(C`open\*(C'\fR with layers that load modules (e.g., "<:encoding(utf8)") no longer +runs the risk of crashing due to stack corruption. +.IP \(bu 4 +Perl 5.18 broke autoloading via \f(CW\*(C`\->SUPER::foo\*(C'\fR method calls by looking +up AUTOLOAD from the current package rather than the current package's +superclass. This has been fixed. [perl #120694] +.IP \(bu 4 +A longstanding bug causing \f(CW\*(C`do {} until CONSTANT\*(C'\fR, where the constant +holds a true value, to read unallocated memory has been resolved. This +would usually happen after a syntax error. In past versions of Perl it has +crashed intermittently. [perl #72406] +.IP \(bu 4 +Fix HP-UX \f(CW$!\fR failure. HP-UX \fBstrerror()\fR returns an empty string for an +unknown error code. This caused an assertion to fail under DEBUGGING +builds. Now instead, the returned string for \f(CW"$!"\fR contains text +indicating the code is for an unknown error. +.IP \(bu 4 +Individually-tied elements of \f(CW@INC\fR (as in \f(CW\*(C`tie $INC[0]...\*(C'\fR) are now +handled correctly. Formerly, whether a sub returned by such a tied element +would be treated as a sub depended on whether a FETCH had occurred +previously. +.IP \(bu 4 +\&\f(CW\*(C`getc\*(C'\fR on a byte-sized handle after the same \f(CW\*(C`getc\*(C'\fR operator had been +used on a utf8 handle used to treat the bytes as utf8, resulting in erratic +behavior (e.g., malformed UTF\-8 warnings). +.IP \(bu 4 +An initial \f(CW\*(C`{\*(C'\fR at the beginning of a format argument line was always +interpreted as the beginning of a block prior to v5.18. In Perl v5.18, it +started being treated as an ambiguous token. The parser would guess +whether it was supposed to be an anonymous hash constructor or a block +based on the contents. Now the previous behaviour has been restored. +[perl #119973] +.IP \(bu 4 +In Perl v5.18 \f(CW\*(C`undef *_; goto &sub\*(C'\fR and \f(CW\*(C`local *_; goto &sub\*(C'\fR started +crashing. This has been fixed. [perl #119949] +.IP \(bu 4 +Backticks (\f(CW \`\` \fR or \f(CW\*(C` qx// \*(C'\fR) combined with multiple threads on +Win32 could result in output sent to stdout on one thread being +captured by backticks of an external command in another thread. +.Sp +This could occur for pseudo-forked processes too, as Win32's +pseudo-fork is implemented in terms of threads. [perl #77672] +.IP \(bu 4 +\&\f(CW\*(C`open $fh, ">+", undef\*(C'\fR no longer leaks memory when TMPDIR is set +but points to a directory a temporary file cannot be created in. [perl +#120951] +.IP \(bu 4 +\&\f(CW\*(C` for ( $h{k} || \*(Aq\*(Aq ) \*(C'\fR no longer auto-vivifies \f(CW$h{k}\fR. [perl +#120374] +.IP \(bu 4 +On Windows machines, Perl now emulates the POSIX use of the environment +for locale initialization. Previously, the environment was ignored. +See "ENVIRONMENT" in perllocale. +.IP \(bu 4 +Fixed a crash when destroying a self-referencing GLOB. [perl #121242] +.SH "Known Problems" +.IX Header "Known Problems" +.IP \(bu 4 +IO::Socket is known to fail tests on AIX 5.3. There is +a patch <https://github.com/Perl/perl5/issues/13484> in the request +tracker, #120835, which may be applied to future releases. +.IP \(bu 4 +The following modules are known to have test failures with this version of +Perl. Patches have been submitted, so there will hopefully be new releases +soon: +.RS 4 +.IP \(bu 4 +Data::Structure::Util version 0.15 +.IP \(bu 4 +HTML::StripScripts version 1.05 +.IP \(bu 4 +List::Gather version 0.08. +.RE +.RS 4 +.RE +.SH Obituary +.IX Header "Obituary" +Diana Rosa, 27, of Rio de Janeiro, went to her long rest on May 10, +2014, along with the plush camel she kept hanging on her computer screen +all the time. She was a passionate Perl hacker who loved the language and its +community, and who never missed a Rio.pm event. She was a true artist, an +enthusiast about writing code, singing arias and graffiting walls. We'll never +forget you. +.PP +Greg McCarroll died on August 28, 2013. +.PP +Greg was well known for many good reasons. He was one of the organisers of +the first YAPC::Europe, which concluded with an unscheduled auction where he +frantically tried to raise extra money to avoid the conference making a +loss. It was Greg who mistakenly arrived for a london.pm meeting a week +late; some years later he was the one who sold the choice of official +meeting date at a YAPC::Europe auction, and eventually as glorious leader of +london.pm he got to inherit the irreverent confusion that he had created. +.PP +Always helpful, friendly and cheerfully optimistic, you will be missed, but +never forgotten. +.SH Acknowledgements +.IX Header "Acknowledgements" +Perl 5.20.0 represents approximately 12 months of development since Perl 5.18.0 +and contains approximately 470,000 lines of changes across 2,900 files from 124 +authors. +.PP +Excluding auto-generated files, documentation and release tools, there were +approximately 280,000 lines of changes to 1,800 .pm, .t, .c and .h files. +.PP +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.20.0: +.PP +Aaron Crane, Abhijit Menon-Sen, Abigail, Abir Viqar, Alan Haggai Alavi, Alan +Hourihane, Alexander Voronov, Alexandr Ciornii, Andy Dougherty, Anno Siegel, +Aristotle Pagaltzis, Arthur Axel 'fREW' Schmidt, Brad Gilbert, Brendan Byrd, +Brian Childs, Brian Fraser, Brian Gottreu, Chris 'BinGOs' Williams, Christian +Millour, Colin Kuskie, Craig A. Berry, Dabrien 'Dabe' Murphy, Dagfinn Ilmari +Mannsåker, Daniel Dragan, Darin McBride, David Golden, David Leadbeater, David +Mitchell, David Nicol, David Steinbrunner, Dennis Kaarsemaker, Dominic +Hargreaves, Ed Avis, Eric Brine, Evan Zacks, Father Chrysostomos, Florian +Ragwitz, François Perrad, Gavin Shelley, Gideon Israel Dsouza, Gisle Aas, +Graham Knop, H.Merijn Brand, Hauke D, Heiko Eissfeldt, Hiroo Hayashi, Hojung +Youn, James E Keenan, Jarkko Hietaniemi, Jerry D. Hedden, Jess Robinson, Jesse +Luehrs, Johan Vromans, John Gardiner Myers, John Goodyear, John P. Linderman, +John Peacock, kafka, Kang-min Liu, Karen Etheridge, Karl Williamson, Keedi Kim, +Kent Fredric, kevin dawson, Kevin Falcone, Kevin Ryde, Leon Timmermans, Lukas +Mai, Marc Simpson, Marcel Grünauer, Marco Peereboom, Marcus Holland-Moritz, +Mark Jason Dominus, Martin McGrath, Matthew Horsfall, Max Maischein, Mike +Doherty, Moritz Lenz, Nathan Glenn, Nathan Trapuzzano, Neil Bowers, Neil +Williams, Nicholas Clark, Niels Thykier, Niko Tyni, Olivier Mengué, Owain G. +Ainsworth, Paul Green, Paul Johnson, Peter John Acklam, Peter Martini, Peter +Rabbitson, Petr Písař, Philip Boulain, Philip Guenther, Piotr Roszatycki, +Rafael Garcia-Suarez, Reini Urban, Reuben Thomas, Ricardo Signes, Ruslan +Zakirov, Sergey Alekseev, Shirakata Kentaro, Shlomi Fish, Slaven Rezic, +Smylers, Steffen Müller, Steve Hay, Sullivan Beck, Thomas Sibley, Tobias +Leich, Toby Inkster, Tokuhiro Matsuno, Tom Christiansen, Tom Hukins, Tony Cook, +Victor Efimov, Viktor Turskyi, Vladimir Timofeev, YAMASHINA Hio, Yves Orton, +Zefram, Zsbán Ambrus, Ævar Arnfjörð Bjarmason. +.PP +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. +.PP +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. +.PP +For a more complete list of all of Perl's historical contributors, please see +the \fIAUTHORS\fR file in the Perl source distribution. +.SH "Reporting Bugs" +.IX Header "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 +http://rt.perl.org/perlbug/ . There may also be information at +http://www.perl.org/ , the Perl Home Page. +.PP +If you believe you have an unreported bug, please run the 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 \f(CW\*(C`perl \-V\*(C'\fR, +will be sent off to perlbug@perl.org to be analysed by the Perl porting team. +.PP +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 perl5\-security\-report@perl.org. 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. +.SH "SEE ALSO" +.IX Header "SEE ALSO" +The \fIChanges\fR file for an explanation of how to view exhaustive details on +what changed. +.PP +The \fIINSTALL\fR file for how to build Perl. +.PP +The \fIREADME\fR file for general stuff. +.PP +The \fIArtistic\fR and \fICopying\fR files for copyright information. |