summaryrefslogtreecommitdiffstats
path: root/upstream/debian-unstable/man1/perl5280delta.1
diff options
context:
space:
mode:
Diffstat (limited to 'upstream/debian-unstable/man1/perl5280delta.1')
-rw-r--r--upstream/debian-unstable/man1/perl5280delta.11863
1 files changed, 1863 insertions, 0 deletions
diff --git a/upstream/debian-unstable/man1/perl5280delta.1 b/upstream/debian-unstable/man1/perl5280delta.1
new file mode 100644
index 00000000..4b9b7774
--- /dev/null
+++ b/upstream/debian-unstable/man1/perl5280delta.1
@@ -0,0 +1,1863 @@
+.\" -*- 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 "PERL5280DELTA 1"
+.TH PERL5280DELTA 1 2024-01-12 "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
+perl5280delta \- what is new for perl v5.28.0
+.SH DESCRIPTION
+.IX Header "DESCRIPTION"
+This document describes differences between the 5.26.0 release and the 5.28.0
+release.
+.PP
+If you are upgrading from an earlier release such as 5.24.0, first read
+perl5260delta, which describes differences between 5.24.0 and 5.26.0.
+.SH "Core Enhancements"
+.IX Header "Core Enhancements"
+.SS "Unicode 10.0 is supported"
+.IX Subsection "Unicode 10.0 is supported"
+A list of changes is at
+<http://www.unicode.org/versions/Unicode10.0.0>.
+.ie n .SS """delete"" on key/value hash slices"
+.el .SS "\f(CWdelete\fP on key/value hash slices"
+.IX Subsection "delete on key/value hash slices"
+\&\f(CW\*(C`delete\*(C'\fR can now be used on
+key/value hash slices,
+returning the keys along with the deleted values.
+[GH #15982] <https://github.com/Perl/perl5/issues/15982>
+.SS "Experimentally, there are now alphabetic synonyms for some regular expression assertions"
+.IX Subsection "Experimentally, there are now alphabetic synonyms for some regular expression assertions"
+If you find it difficult to remember how to write certain of the pattern
+assertions, there are now alphabetic synonyms.
+.PP
+.Vb 7
+\& CURRENT NEW SYNONYMS
+\& \-\-\-\-\-\- \-\-\-\-\-\-\-\-\-\-\-\-
+\& (?=...) (*pla:...) or (*positive_lookahead:...)
+\& (?!...) (*nla:...) or (*negative_lookahead:...)
+\& (?<=...) (*plb:...) or (*positive_lookbehind:...)
+\& (?<!...) (*nlb:...) or (*negative_lookbehind:...)
+\& (?>...) (*atomic:...)
+.Ve
+.PP
+These are considered experimental, so using any of these will raise
+(unless turned off) a warning in the \f(CW\*(C`experimental::alpha_assertions\*(C'\fR
+category.
+.SS "Mixed Unicode scripts are now detectable"
+.IX Subsection "Mixed Unicode scripts are now detectable"
+A mixture of scripts, such as Cyrillic and Latin, in a string is often
+the sign of a spoofing attack. A new regular expression construct
+now allows for easy detection of these. For example, you can say
+.PP
+.Vb 1
+\& qr/(*script_run: \ed+ \eb )/x
+.Ve
+.PP
+And the digits matched will all be from the same set of 10. You won't
+get a look-alike digit from a different script that has a different
+value than what it appears to be.
+.PP
+Or:
+.PP
+.Vb 1
+\& qr/(*sr: \eb \ew+ \eb )/x
+.Ve
+.PP
+makes sure that all the characters come from the same script.
+.PP
+You can also combine script runs with \f(CW\*(C`(?>...)\*(C'\fR (or
+\&\f(CW\*(C`*atomic:...)\*(C'\fR).
+.PP
+Instead of writing:
+.PP
+.Vb 1
+\& (*sr:(?<...))
+.Ve
+.PP
+you can now run:
+.PP
+.Vb 3
+\& (*asr:...)
+\& # or
+\& (*atomic_script_run:...)
+.Ve
+.PP
+This is considered experimental, so using it will raise (unless turned
+off) a warning in the \f(CW\*(C`experimental::script_run\*(C'\fR category.
+.PP
+See "Script Runs" in perlre.
+.ie n .SS "In-place editing with ""perl \-i"" is now safer"
+.el .SS "In-place editing with \f(CWperl \-i\fP is now safer"
+.IX Subsection "In-place editing with perl -i is now safer"
+Previously in-place editing (\f(CW\*(C`perl \-i\*(C'\fR) would delete or rename the
+input file as soon as you started working on a new file.
+.PP
+Without backups this would result in loss of data if there was an
+error, such as a full disk, when writing to the output file.
+.PP
+This has changed so that the input file isn't replaced until the
+output file has been completely written and successfully closed.
+.PP
+This works by creating a work file in the same directory, which is
+renamed over the input file once the output file is complete.
+.PP
+Incompatibilities:
+.IP \(bu 4
+Since this renaming needs to only happen once, if you create a thread
+or child process, that renaming will only happen in the original
+thread or process.
+.IP \(bu 4
+If you change directories while processing a file, and your operating
+system doesn't provide the \f(CWunlinkat()\fR, \f(CWrenameat()\fR and \f(CWfchmodat()\fR
+functions, the final rename step may fail.
+.PP
+[GH #15216] <https://github.com/Perl/perl5/issues/15216>
+.SS "Initialisation of aggregate state variables"
+.IX Subsection "Initialisation of aggregate state variables"
+A persistent lexical array or hash variable can now be initialized,
+by an expression such as \f(CW\*(C`state @a = qw(x y z)\*(C'\fR. Initialization of a
+list of persistent lexical variables is still not possible.
+.SS "Full-size inode numbers"
+.IX Subsection "Full-size inode numbers"
+On platforms where inode numbers are of a type larger than perl's native
+integer numerical types, stat will preserve the full
+content of large inode numbers by returning them in the form of strings of
+decimal digits. Exact comparison of inode numbers can thus be achieved by
+comparing with \f(CW\*(C`eq\*(C'\fR rather than \f(CW\*(C`==\*(C'\fR. Comparison with \f(CW\*(C`==\*(C'\fR, and other
+numerical operations (which are usually meaningless on inode numbers),
+work as well as they did before, which is to say they fall back to
+floating point, and ultimately operate on a fairly useless rounded inode
+number if the real inode number is too big for the floating point format.
+.ie n .SS "The ""sprintf"" %j format size modifier is now available with pre\-C99 compilers"
+.el .SS "The \f(CWsprintf\fP \f(CW%j\fP format size modifier is now available with pre\-C99 compilers"
+.IX Subsection "The sprintf %j format size modifier is now available with pre-C99 compilers"
+The actual size used depends on the platform, so remains unportable.
+.SS "Close-on-exec flag set atomically"
+.IX Subsection "Close-on-exec flag set atomically"
+When opening a file descriptor, perl now generally opens it with its
+close-on-exec flag already set, on platforms that support doing so.
+This improves thread safety, because it means that an \f(CW\*(C`exec\*(C'\fR initiated
+by one thread can no longer cause a file descriptor in the process
+of being opened by another thread to be accidentally passed to the
+executed program.
+.PP
+Additionally, perl now sets the close-on-exec flag more reliably, whether
+it does so atomically or not. Most file descriptors were getting the
+flag set, but some were being missed.
+.SS "String\- and number-specific bitwise ops are no longer experimental"
+.IX Subsection "String- and number-specific bitwise ops are no longer experimental"
+The new string-specific (\f(CW\*(C`&. |. ^. ~.\*(C'\fR) and number-specific (\f(CW\*(C`& | ^ ~\*(C'\fR)
+bitwise operators introduced in Perl 5.22 that are available within the
+scope of \f(CW\*(C`use feature \*(Aqbitwise\*(Aq\*(C'\fR are no longer experimental.
+Because the number-specific ops are spelled the same way as the existing
+operators that choose their behaviour based on their operands, these
+operators must still be enabled via the "bitwise" feature, in either of
+these two ways:
+.PP
+.Vb 1
+\& use feature "bitwise";
+\&
+\& use v5.28; # "bitwise" now included
+.Ve
+.PP
+They are also now enabled by the \fB\-E\fR command-line switch.
+.PP
+The "bitwise" feature no longer emits a warning. Existing code that
+disables the "experimental::bitwise" warning category that the feature
+previously used will continue to work.
+.PP
+One caveat that module authors ought to be aware of is that the numeric
+operators now pass a fifth TRUE argument to overload methods. Any methods
+that check the number of operands may croak if they do not expect so many.
+XS authors in particular should be aware that this:
+.PP
+.Vb 2
+\& SV *
+\& bitop_handler (lobj, robj, swap)
+.Ve
+.PP
+may need to be changed to this:
+.PP
+.Vb 2
+\& SV *
+\& bitop_handler (lobj, robj, swap, ...)
+.Ve
+.SS "Locales are now thread-safe on systems that support them"
+.IX Subsection "Locales are now thread-safe on systems that support them"
+These systems include Windows starting with Visual Studio 2005, and in
+POSIX 2008 systems.
+.PP
+The implication is that you are now free to use locales and change them
+in a threaded environment. Your changes affect only your thread.
+See "Multi-threaded operation" in perllocale
+.ie n .SS "New read-only predefined variable ""${^SAFE_LOCALES}"""
+.el .SS "New read-only predefined variable \f(CW${^SAFE_LOCALES}\fP"
+.IX Subsection "New read-only predefined variable ${^SAFE_LOCALES}"
+This variable is 1 if the Perl interpreter is operating in an
+environment where it is safe to use and change locales (see
+perllocale.) This variable is true when the perl is
+unthreaded, or compiled in a platform that supports thread-safe locale
+operation (see previous item).
+.SH Security
+.IX Header "Security"
+.SS "[CVE\-2017\-12837] Heap buffer overflow in regular expression compiler"
+.IX Subsection "[CVE-2017-12837] Heap buffer overflow in regular expression compiler"
+Compiling certain regular expression patterns with the case-insensitive
+modifier could cause a heap buffer overflow and crash perl. This has now been
+fixed.
+[GH #16021] <https://github.com/Perl/perl5/issues/16021>
+.SS "[CVE\-2017\-12883] Buffer over-read in regular expression parser"
+.IX Subsection "[CVE-2017-12883] Buffer over-read in regular expression parser"
+For certain types of syntax error in a regular expression pattern, the error
+message could either contain the contents of a random, possibly large, chunk of
+memory, or could crash perl. This has now been fixed.
+[GH #16025] <https://github.com/Perl/perl5/issues/16025>
+.ie n .SS "[CVE\-2017\-12814] $ENV{$key} stack buffer overflow on Windows"
+.el .SS "[CVE\-2017\-12814] \f(CW$ENV{$key}\fP stack buffer overflow on Windows"
+.IX Subsection "[CVE-2017-12814] $ENV{$key} stack buffer overflow on Windows"
+A possible stack buffer overflow in the \f(CW%ENV\fR code on Windows has been fixed
+by removing the buffer completely since it was superfluous anyway.
+[GH #16051] <https://github.com/Perl/perl5/issues/16051>
+.SS "Default Hash Function Change"
+.IX Subsection "Default Hash Function Change"
+Perl 5.28.0 retires various older hash functions which are not viewed as
+sufficiently secure for use in Perl. We now support four general purpose
+hash functions, Siphash (2\-4 and 1\-3 variants), and Zaphod32, and StadtX
+hash. In addition we support SBOX32 (a form of tabular hashing) for hashing
+short strings, in conjunction with any of the other hash functions provided.
+.PP
+By default Perl is configured to support SBOX hashing of strings up to 24
+characters, in conjunction with StadtX hashing on 64 bit builds, and
+Zaphod32 hashing for 32 bit builds.
+.PP
+You may control these settings with the following options to Configure:
+.PP
+.Vb 4
+\& \-DPERL_HASH_FUNC_SIPHASH
+\& \-DPERL_HASH_FUNC_SIPHASH13
+\& \-DPERL_HASH_FUNC_STADTX
+\& \-DPERL_HASH_FUNC_ZAPHOD32
+.Ve
+.PP
+To disable SBOX hashing you can use
+.PP
+.Vb 1
+\& \-DPERL_HASH_USE_SBOX32_ALSO=0
+.Ve
+.PP
+And to set the maximum length to use SBOX32 hashing on with:
+.PP
+.Vb 1
+\& \-DSBOX32_MAX_LEN=16
+.Ve
+.PP
+The maximum length allowed is 256. There probably isn't much point
+in setting it higher than the default.
+.SH "Incompatible Changes"
+.IX Header "Incompatible Changes"
+.SS "Subroutine attribute and signature order"
+.IX Subsection "Subroutine attribute and signature order"
+The experimental subroutine signatures feature has been changed so that
+subroutine attributes must now come before the signature rather than
+after. This is because attributes like \f(CW\*(C`:lvalue\*(C'\fR can affect the
+compilation of code within the signature, for example:
+.PP
+.Vb 1
+\& sub f :lvalue ($a = do { $x = "abc"; return substr($x,0,1)}) { ...}
+.Ve
+.PP
+Note that this the second time they have been flipped:
+.PP
+.Vb 2
+\& sub f :lvalue ($a, $b) { ... }; # 5.20; 5.28 onwards
+\& sub f ($a, $b) :lvalue { ... }; # 5.22 \- 5.26
+.Ve
+.SS "Comma-less variable lists in formats are no longer allowed"
+.IX Subsection "Comma-less variable lists in formats are no longer allowed"
+Omitting the commas between variables passed to formats is no longer
+allowed. This has been deprecated since Perl 5.000.
+.ie n .SS "The "":locked"" and "":unique"" attributes have been removed"
+.el .SS "The \f(CW:locked\fP and \f(CW:unique\fP attributes have been removed"
+.IX Subsection "The :locked and :unique attributes have been removed"
+These have been no-ops and deprecated since Perl 5.12 and 5.10,
+respectively.
+.ie n .SS """\eN{}"" with nothing between the braces is now illegal"
+.el .SS "\f(CW\eN{}\fP with nothing between the braces is now illegal"
+.IX Subsection "N{} with nothing between the braces is now illegal"
+This has been deprecated since Perl 5.24.
+.SS "Opening the same symbol as both a file and directory handle is no longer allowed"
+.IX Subsection "Opening the same symbol as both a file and directory handle is no longer allowed"
+Using \f(CWopen()\fR and \f(CWopendir()\fR to associate both a filehandle and a dirhandle
+to the same symbol (glob or scalar) has been deprecated since Perl 5.10.
+.ie n .SS "Use of bare ""<<"" to mean ""<<"""""" is no longer allowed"
+.el .SS "Use of bare \f(CW<<\fP to mean \f(CW<<""""\fP is no longer allowed"
+.IX Subsection "Use of bare << to mean <<"""" is no longer allowed"
+Use of a bare terminator has been deprecated since Perl 5.000.
+.SS "Setting $/ to a reference to a non-positive integer no longer allowed"
+.IX Subsection "Setting $/ to a reference to a non-positive integer no longer allowed"
+This used to work like setting it to \f(CW\*(C`undef\*(C'\fR, but has been deprecated
+since Perl 5.20.
+.ie n .SS "Unicode code points with values exceeding ""IV_MAX"" are now fatal"
+.el .SS "Unicode code points with values exceeding \f(CWIV_MAX\fP are now fatal"
+.IX Subsection "Unicode code points with values exceeding IV_MAX are now fatal"
+This was deprecated since Perl 5.24.
+.ie n .SS "The ""B::OP::terse"" method has been removed"
+.el .SS "The \f(CWB::OP::terse\fP method has been removed"
+.IX Subsection "The B::OP::terse method has been removed"
+Use \f(CW\*(C`B::Concise::b_terse\*(C'\fR instead.
+.SS "Use of inherited AUTOLOAD for non-methods is no longer allowed"
+.IX Subsection "Use of inherited AUTOLOAD for non-methods is no longer allowed"
+This was deprecated in Perl 5.004.
+.SS "Use of strings with code points over 0xFF is not allowed for bitwise string operators"
+.IX Subsection "Use of strings with code points over 0xFF is not allowed for bitwise string operators"
+Code points over \f(CW0xFF\fR do not make sense for bitwise operators and such
+an operation will now croak, except for a few remaining cases. See
+perldeprecation.
+.PP
+This was deprecated in Perl 5.24.
+.ie n .SS "Setting ""${^ENCODING}"" to a defined value is now illegal"
+.el .SS "Setting \f(CW${^ENCODING}\fP to a defined value is now illegal"
+.IX Subsection "Setting ${^ENCODING} to a defined value is now illegal"
+This has been deprecated since Perl 5.22 and a no-op since Perl 5.26.
+.ie n .SS "Backslash no longer escapes colon in PATH for the ""\-S"" switch"
+.el .SS "Backslash no longer escapes colon in PATH for the \f(CW\-S\fP switch"
+.IX Subsection "Backslash no longer escapes colon in PATH for the -S switch"
+Previously the \f(CW\*(C`\-S\*(C'\fR switch incorrectly treated backslash ("\e") as an
+escape for colon when traversing the \f(CW\*(C`PATH\*(C'\fR environment variable.
+[GH #15584] <https://github.com/Perl/perl5/issues/15584>
+.SS "the \-DH (DEBUG_H) misfeature has been removed"
+.IX Subsection "the -DH (DEBUG_H) misfeature has been removed"
+On a perl built with debugging support, the \f(CW\*(C`H\*(C'\fR flag to the \f(CW\*(C`\-D\*(C'\fR
+debugging option has been removed. This was supposed to dump hash values,
+but has been broken for many years.
+.SS "Yada-yada is now strictly a statement"
+.IX Subsection "Yada-yada is now strictly a statement"
+By the time of its initial stable release in Perl 5.12, the \f(CW\*(C`...\*(C'\fR
+(yada-yada) operator was explicitly intended to serve as a statement,
+not an expression. However, the original implementation was confused
+on this point, leading to inconsistent parsing. The operator was
+accidentally accepted in a few situations where it did not serve as a
+complete statement, such as
+.PP
+.Vb 2
+\& ... . "foo";
+\& ... if $a < $b;
+.Ve
+.PP
+The parsing has now been made consistent, permitting yada-yada only as
+a statement. Affected code can use \f(CW\*(C`do{...}\*(C'\fR to put a yada-yada into
+an arbitrary expression context.
+.SS "Sort algorithm can no longer be specified"
+.IX Subsection "Sort algorithm can no longer be specified"
+Since Perl 5.8, the sort pragma has had subpragmata \f(CW\*(C`_mergesort\*(C'\fR,
+\&\f(CW\*(C`_quicksort\*(C'\fR, and \f(CW\*(C`_qsort\*(C'\fR that can be used to specify which algorithm
+perl should use to implement the sort builtin.
+This was always considered a dubious feature that might not last,
+hence the underscore spellings, and they were documented as not being
+portable beyond Perl 5.8. These subpragmata have now been deleted,
+and any attempt to use them is an error. The sort pragma otherwise
+remains, and the algorithm-neutral \f(CW\*(C`stable\*(C'\fR subpragma can be used to
+control sorting behaviour.
+[GH #13234] <https://github.com/Perl/perl5/issues/13234>
+.SS "Over-radix digits in floating point literals"
+.IX Subsection "Over-radix digits in floating point literals"
+Octal and binary floating point literals used to permit any hexadecimal
+digit to appear after the radix point. The digits are now restricted
+to those appropriate for the radix, as digits before the radix point
+always were.
+.ie n .SS "Return type of unpackstring()"
+.el .SS "Return type of \f(CWunpackstring()\fP"
+.IX Subsection "Return type of unpackstring()"
+The return types of the C API functions \f(CWunpackstring()\fR and
+\&\f(CWunpack_str()\fR have changed from \f(CW\*(C`I32\*(C'\fR to \f(CW\*(C`SSize_t\*(C'\fR, in order to
+accommodate datasets of more than two billion items.
+.SH Deprecations
+.IX Header "Deprecations"
+.ie n .SS "Use of ""vec"" on strings with code points above 0xFF is deprecated"
+.el .SS "Use of \f(CWvec\fP on strings with code points above 0xFF is deprecated"
+.IX Subsection "Use of vec on strings with code points above 0xFF is deprecated"
+Such strings are represented internally in UTF\-8, and \f(CW\*(C`vec\*(C'\fR is a
+bit-oriented operation that will likely give unexpected results on those
+strings.
+.ie n .SS "Some uses of unescaped ""{"" in regexes are no longer fatal"
+.el .SS "Some uses of unescaped \f(CW""{""\fP in regexes are no longer fatal"
+.IX Subsection "Some uses of unescaped ""{"" in regexes are no longer fatal"
+Perl 5.26.0 fatalized some uses of an unescaped left brace, but an
+exception was made at the last minute, specifically crafted to be a
+minimal change to allow GNU Autoconf to work. That tool is heavily
+depended upon, and continues to use the deprecated usage. Its use of an
+unescaped left brace is one where we have no intention of repurposing
+\&\f(CW"{"\fR to be something other than itself.
+.PP
+That exception is now generalized to include various other such cases
+where the \f(CW"{"\fR will not be repurposed.
+.PP
+Note that these uses continue to raise a deprecation message.
+.ie n .SS "Use of unescaped ""{"" immediately after a ""("" in regular expression patterns is deprecated"
+.el .SS "Use of unescaped \f(CW""{""\fP immediately after a \f(CW""(""\fP in regular expression patterns is deprecated"
+.IX Subsection "Use of unescaped ""{"" immediately after a ""("" in regular expression patterns is deprecated"
+Using unescaped left braces is officially deprecated everywhere, but it
+is not enforced in contexts where their use does not interfere with
+expected extensions to the language. A deprecation is added in this
+release when the brace appears immediately after an opening parenthesis.
+Before this, even if the brace was part of a legal quantifier, it was
+not interpreted as such, but as the literal characters, unlike other
+quantifiers that follow a \f(CW"("\fR which are considered errors. Now,
+their use will raise a deprecation message, unless turned off.
+.ie n .SS "Assignment to $[ will be fatal in Perl 5.30"
+.el .SS "Assignment to \f(CW$[\fP will be fatal in Perl 5.30"
+.IX Subsection "Assignment to $[ will be fatal in Perl 5.30"
+Assigning a non-zero value to \f(CW$[\fR has been deprecated
+since Perl 5.12, but was never given a deadline for removal. This has
+now been scheduled for Perl 5.30.
+.SS "\fBhostname()\fP won't accept arguments in Perl 5.32"
+.IX Subsection "hostname() won't accept arguments in Perl 5.32"
+Passing arguments to \f(CWSys::Hostname::hostname()\fR was already deprecated,
+but didn't have a removal date. This has now been scheduled for Perl
+5.32. [GH #14662] <https://github.com/Perl/perl5/issues/14662>
+.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 these are (with rare exceptions) fine modules that you are encouraged
+to continue to use. Their disinclusion from core primarily hinges on their
+necessity to bootstrapping a fully functional, CPAN-capable Perl installation,
+not usually on concerns over their design.
+.IP B::Debug 4
+.IX Item "B::Debug"
+.PD 0
+.IP "Locale::Codes and its associated Country, Currency and Language modules" 4
+.IX Item "Locale::Codes and its associated Country, Currency and Language modules"
+.PD
+.SH "Performance Enhancements"
+.IX Header "Performance Enhancements"
+.IP \(bu 4
+The start up overhead for creating regular expression patterns with
+Unicode properties (\f(CW\*(C`\ep{...}\*(C'\fR) has been greatly reduced in most cases.
+.IP \(bu 4
+Many string concatenation expressions are now considerably faster, due
+to the introduction internally of a \f(CW\*(C`multiconcat\*(C'\fR opcode which combines
+multiple concatenations, and optionally a \f(CW\*(C`=\*(C'\fR or \f(CW\*(C`.=\*(C'\fR, into a single
+action. For example, apart from retrieving \f(CW$s\fR, \f(CW$a\fR and \f(CW$b\fR, this
+whole expression is now handled as a single op:
+.Sp
+.Vb 1
+\& $s .= "a=$a b=$b\en"
+.Ve
+.Sp
+As a special case, if the LHS of an assignment is a lexical variable or
+\&\f(CW\*(C`my $s\*(C'\fR, the op itself handles retrieving the lexical variable, which
+is faster.
+.Sp
+In general, the more the expression includes a mix of constant strings and
+variable expressions, the longer the expression, and the more it mixes
+together non\-utf8 and utf8 strings, the more marked the performance
+improvement. For example on a \f(CW\*(C`x86_64\*(C'\fR system, this code has been
+benchmarked running four times faster:
+.Sp
+.Vb 4
+\& my $s;
+\& my $a = "ab\ex{100}cde";
+\& my $b = "fghij";
+\& my $c = "\ex{101}klmn";
+\&
+\& for my $i (1..10_000_000) {
+\& $s = "\ex{100}wxyz";
+\& $s .= "foo=$a bar=$b baz=$c";
+\& }
+.Ve
+.Sp
+In addition, \f(CW\*(C`sprintf\*(C'\fR expressions which have a constant format
+containing only \f(CW%s\fR and \f(CW\*(C`%%\*(C'\fR format elements, and which have a fixed
+number of arguments, are now also optimised into a \f(CW\*(C`multiconcat\*(C'\fR op.
+.IP \(bu 4
+The \f(CWref()\fR builtin is now much faster in boolean context, since it no
+longer bothers to construct a temporary string like \f(CW\*(C`Foo=ARRAY(0x134af48)\*(C'\fR.
+.IP \(bu 4
+\&\f(CWkeys()\fR in void and scalar contexts is now more efficient.
+.IP \(bu 4
+The common idiom of comparing the result of \fBindex()\fR with \-1 is now
+specifically optimised, e.g.
+.Sp
+.Vb 1
+\& if (index(...) != \-1) { ... }
+.Ve
+.IP \(bu 4
+\&\f(CWfor()\fR loops and similar constructs are now more efficient in most cases.
+.IP \(bu 4
+File::Glob has been modified to remove unnecessary backtracking and
+recursion, thanks to Russ Cox. See <https://research.swtch.com/glob>
+for more details.
+.IP \(bu 4
+The XS-level \f(CWSvTRUE()\fR API function is now more efficient.
+.IP \(bu 4
+Various integer-returning ops are now more efficient in scalar/boolean context.
+.IP \(bu 4
+Slightly improved performance when parsing stash names.
+[GH #15689] <https://github.com/Perl/perl5/issues/15689>
+.IP \(bu 4
+Calls to \f(CW\*(C`require\*(C'\fR for an already loaded module are now slightly faster.
+[GH #16175] <https://github.com/Perl/perl5/issues/16175>
+.IP \(bu 4
+The performance of pattern matching \f(CW\*(C`[[:ascii:]]\*(C'\fR and \f(CW\*(C`[[:^ascii:]]\*(C'\fR
+has been improved significantly except on EBCDIC platforms.
+.IP \(bu 4
+Various optimizations have been applied to matching regular expression
+patterns, so under the right circumstances, significant performance
+gains may be noticed. But in an application with many varied patterns,
+little overall improvement likely will be seen.
+.IP \(bu 4
+Other optimizations have been applied to UTF\-8 handling, but these are
+not typically a major factor in most applications.
+.SH "Modules and Pragmata"
+.IX Header "Modules and Pragmata"
+Key highlights in this release across several modules:
+.SS "Removal of use vars"
+.IX Subsection "Removal of use vars"
+The usage of \f(CW\*(C`use vars\*(C'\fR has been discouraged since the introduction of
+\&\f(CW\*(C`our\*(C'\fR in Perl 5.6.0. Where possible the usage of this pragma has now been
+removed from the Perl source code.
+.PP
+This had a slight effect (for the better) on the output of WARNING_BITS in
+B::Deparse.
+.SS "Use of DynaLoader changed to XSLoader in many modules"
+.IX Subsection "Use of DynaLoader changed to XSLoader in many modules"
+XSLoader is more modern, and most modules already require perl 5.6 or
+greater, so no functionality is lost by switching. In some cases, we have
+also made changes to the local implementation that may not be reflected in
+the version on CPAN due to a desire to maintain more backwards
+compatibility.
+.SS "Updated Modules and Pragmata"
+.IX Subsection "Updated Modules and Pragmata"
+.IP \(bu 4
+Archive::Tar has been upgraded from version 2.24 to 2.30.
+.Sp
+This update also handled CVE\-2018\-12015: directory traversal
+vulnerability.
+[cpan #125523] <https://rt.cpan.org/Ticket/Display.html?id=125523>
+.IP \(bu 4
+arybase has been upgraded from version 0.12 to 0.15.
+.IP \(bu 4
+Attribute::Handlers has been upgraded from version 0.99 to 1.01.
+.IP \(bu 4
+attributes has been upgraded from version 0.29 to 0.33.
+.IP \(bu 4
+B has been upgraded from version 1.68 to 1.74.
+.IP \(bu 4
+B::Concise has been upgraded from version 0.999 to 1.003.
+.IP \(bu 4
+B::Debug has been upgraded from version 1.24 to 1.26.
+.Sp
+NOTE: B::Debug is deprecated and may be removed from a future version
+of Perl.
+.IP \(bu 4
+B::Deparse has been upgraded from version 1.40 to 1.48.
+.Sp
+It includes many bug fixes, and in particular, it now deparses variable
+attributes correctly:
+.Sp
+.Vb 2
+\& my $x :foo; # used to deparse as
+\& # \*(Aqattributes\*(Aq\->import(\*(Aqmain\*(Aq, \e$x, \*(Aqfoo\*(Aq), my $x;
+.Ve
+.IP \(bu 4
+base has been upgraded from version 2.25 to 2.27.
+.IP \(bu 4
+bignum has been upgraded from version 0.47 to 0.49.
+.IP \(bu 4
+blib has been upgraded from version 1.06 to 1.07.
+.IP \(bu 4
+bytes has been upgraded from version 1.05 to 1.06.
+.IP \(bu 4
+Carp has been upgraded from version 1.42 to 1.50.
+.Sp
+If a package on the call stack contains a constant named \f(CW\*(C`ISA\*(C'\fR, Carp no
+longer throws a "Not a GLOB reference" error.
+.Sp
+Carp, when generating stack traces, now attempts to work around
+longstanding bugs resulting from Perl's non-reference-counted stack.
+[GH #9282] <https://github.com/Perl/perl5/issues/9282>
+.Sp
+Carp has been modified to avoid assuming that objects cannot be
+overloaded without the overload module loaded (this can happen with
+objects created by XS modules). Previously, infinite recursion would
+result if an XS-defined overload method itself called Carp.
+[GH #16407] <https://github.com/Perl/perl5/issues/16407>
+.Sp
+Carp now avoids using \f(CW\*(C`overload::StrVal\*(C'\fR, partly because older versions
+of overload (included with perl 5.14 and earlier) load Scalar::Util
+at run time, which will fail if Carp has been invoked after a syntax error.
+.IP \(bu 4
+charnames has been upgraded from version 1.44 to 1.45.
+.IP \(bu 4
+Compress::Raw::Zlib has been upgraded from version 2.074 to 2.076.
+.Sp
+This addresses a security vulnerability in older versions of the 'zlib' library
+(which is bundled with Compress-Raw-Zlib).
+.IP \(bu 4
+Config::Extensions has been upgraded from version 0.01 to 0.02.
+.IP \(bu 4
+Config::Perl::V has been upgraded from version 0.28 to 0.29.
+.IP \(bu 4
+CPAN has been upgraded from version 2.18 to 2.20.
+.IP \(bu 4
+Data::Dumper has been upgraded from version 2.167 to 2.170.
+.Sp
+Quoting of glob names now obeys the Useqq option
+[GH #13274] <https://github.com/Perl/perl5/issues/13274>.
+.Sp
+Attempts to set an option to \f(CW\*(C`undef\*(C'\fR through a combined getter/setter
+method are no longer mistaken for getter calls
+[GH #12135] <https://github.com/Perl/perl5/issues/12135>.
+.IP \(bu 4
+Devel::Peek has been upgraded from version 1.26 to 1.27.
+.IP \(bu 4
+Devel::PPPort has been upgraded from version 3.35 to 3.40.
+.Sp
+Devel::PPPort has moved from cpan-first to perl-first maintenance
+.Sp
+Primary responsibility for the code in Devel::PPPort has moved into core perl.
+In a practical sense there should be no change except that hopefully it will
+stay more up to date with changes made to symbols in perl, rather than needing
+to be updated after the fact.
+.IP \(bu 4
+Digest::SHA has been upgraded from version 5.96 to 6.01.
+.IP \(bu 4
+DirHandle has been upgraded from version 1.04 to 1.05.
+.IP \(bu 4
+DynaLoader has been upgraded from version 1.42 to 1.45.
+.Sp
+Its documentation now shows the use of \f(CW\*(C`_\|_PACKAGE_\|_\*(C'\fR and direct object
+syntax
+[GH #16190] <https://github.com/Perl/perl5/issues/16190>.
+.IP \(bu 4
+Encode has been upgraded from version 2.88 to 2.97.
+.IP \(bu 4
+encoding has been upgraded from version 2.19 to 2.22.
+.IP \(bu 4
+Errno has been upgraded from version 1.28 to 1.29.
+.IP \(bu 4
+experimental has been upgraded from version 0.016 to 0.019.
+.IP \(bu 4
+Exporter has been upgraded from version 5.72 to 5.73.
+.IP \(bu 4
+ExtUtils::CBuilder has been upgraded from version 0.280225 to 0.280230.
+.IP \(bu 4
+ExtUtils::Constant has been upgraded from version 0.23 to 0.25.
+.IP \(bu 4
+ExtUtils::Embed has been upgraded from version 1.34 to 1.35.
+.IP \(bu 4
+ExtUtils::Install has been upgraded from version 2.04 to 2.14.
+.IP \(bu 4
+ExtUtils::MakeMaker has been upgraded from version 7.24 to 7.34.
+.IP \(bu 4
+ExtUtils::Miniperl has been upgraded from version 1.06 to 1.08.
+.IP \(bu 4
+ExtUtils::ParseXS has been upgraded from version 3.34 to 3.39.
+.IP \(bu 4
+ExtUtils::Typemaps has been upgraded from version 3.34 to 3.38.
+.IP \(bu 4
+ExtUtils::XSSymSet has been upgraded from version 1.3 to 1.4.
+.IP \(bu 4
+feature has been upgraded from version 1.47 to 1.52.
+.IP \(bu 4
+fields has been upgraded from version 2.23 to 2.24.
+.IP \(bu 4
+File::Copy has been upgraded from version 2.32 to 2.33.
+.Sp
+It will now use the sub-second precision variant of \fButime()\fR supplied by
+Time::HiRes where available.
+[GH #16225] <https://github.com/Perl/perl5/issues/16225>.
+.IP \(bu 4
+File::Fetch has been upgraded from version 0.52 to 0.56.
+.IP \(bu 4
+File::Glob has been upgraded from version 1.28 to 1.31.
+.IP \(bu 4
+File::Path has been upgraded from version 2.12_01 to 2.15.
+.IP \(bu 4
+File::Spec and Cwd have been upgraded from version 3.67 to 3.74.
+.IP \(bu 4
+File::stat has been upgraded from version 1.07 to 1.08.
+.IP \(bu 4
+FileCache has been upgraded from version 1.09 to 1.10.
+.IP \(bu 4
+Filter::Simple has been upgraded from version 0.93 to 0.95.
+.IP \(bu 4
+Filter::Util::Call has been upgraded from version 1.55 to 1.58.
+.IP \(bu 4
+GDBM_File has been upgraded from version 1.15 to 1.17.
+.Sp
+Its documentation now explains that \f(CW\*(C`each\*(C'\fR and \f(CW\*(C`delete\*(C'\fR don't mix in
+hashes tied to this module
+[GH #12894] <https://github.com/Perl/perl5/issues/12894>.
+.Sp
+It will now retry opening with an acceptable block size if asking gdbm
+to default the block size failed
+[GH #13232] <https://github.com/Perl/perl5/issues/13232>.
+.IP \(bu 4
+Getopt::Long has been upgraded from version 2.49 to 2.5.
+.IP \(bu 4
+Hash::Util::FieldHash has been upgraded from version 1.19 to 1.20.
+.IP \(bu 4
+I18N::Langinfo has been upgraded from version 0.13 to 0.17.
+.Sp
+This module is now available on all platforms, emulating the system
+\&\fBnl_langinfo\fR\|(3) on systems that lack it. Some caveats apply, as
+detailed in its documentation, the most severe being
+that, except for MS Windows, the \f(CW\*(C`CODESET\*(C'\fR item is not implemented on
+those systems, always returning \f(CW""\fR.
+.Sp
+It now sets the UTF\-8 flag in its returned scalar if the string contains
+legal non-ASCII UTF\-8, and the locale is UTF\-8
+[GH #15131] <https://github.com/Perl/perl5/issues/15131>.
+.Sp
+This update also fixes a bug in which the underlying locale was ignored
+for the \f(CW\*(C`RADIXCHAR\*(C'\fR (always was returned as a dot) and the \f(CW\*(C`THOUSEP\*(C'\fR
+(always empty). Now the locale-appropriate values are returned.
+.IP \(bu 4
+I18N::LangTags has been upgraded from version 0.42 to 0.43.
+.IP \(bu 4
+if has been upgraded from version 0.0606 to 0.0608.
+.IP \(bu 4
+IO has been upgraded from version 1.38 to 1.39.
+.IP \(bu 4
+IO::Socket::IP has been upgraded from version 0.38 to 0.39.
+.IP \(bu 4
+IPC::Cmd has been upgraded from version 0.96 to 1.00.
+.IP \(bu 4
+JSON::PP has been upgraded from version 2.27400_02 to 2.97001.
+.IP \(bu 4
+The \f(CW\*(C`libnet\*(C'\fR distribution has been upgraded from version 3.10 to 3.11.
+.IP \(bu 4
+List::Util has been upgraded from version 1.46_02 to 1.49.
+.IP \(bu 4
+Locale::Codes has been upgraded from version 3.42 to 3.56.
+.Sp
+\&\fBNOTE\fR: Locale::Codes scheduled to be removed from core in Perl 5.30.
+.IP \(bu 4
+Locale::Maketext has been upgraded from version 1.28 to 1.29.
+.IP \(bu 4
+Math::BigInt has been upgraded from version 1.999806 to 1.999811.
+.IP \(bu 4
+Math::BigInt::FastCalc has been upgraded from version 0.5005 to 0.5006.
+.IP \(bu 4
+Math::BigRat has been upgraded from version 0.2611 to 0.2613.
+.IP \(bu 4
+Module::CoreList has been upgraded from version 5.20170530 to 5.20180622.
+.IP \(bu 4
+mro has been upgraded from version 1.20 to 1.22.
+.IP \(bu 4
+Net::Ping has been upgraded from version 2.55 to 2.62.
+.IP \(bu 4
+NEXT has been upgraded from version 0.67 to 0.67_01.
+.IP \(bu 4
+ODBM_File has been upgraded from version 1.14 to 1.15.
+.IP \(bu 4
+Opcode has been upgraded from version 1.39 to 1.43.
+.IP \(bu 4
+overload has been upgraded from version 1.28 to 1.30.
+.IP \(bu 4
+PerlIO::encoding has been upgraded from version 0.25 to 0.26.
+.IP \(bu 4
+PerlIO::scalar has been upgraded from version 0.26 to 0.29.
+.IP \(bu 4
+PerlIO::via has been upgraded from version 0.16 to 0.17.
+.IP \(bu 4
+Pod::Functions has been upgraded from version 1.11 to 1.13.
+.IP \(bu 4
+Pod::Html has been upgraded from version 1.2202 to 1.24.
+.Sp
+A title for the HTML document will now be automatically generated by
+default from a "NAME" section in the POD document, as it used to be
+before the module was rewritten to use Pod::Simple::XHTML to do the
+core of its job
+[GH #11954] <https://github.com/Perl/perl5/issues/11954>.
+.IP \(bu 4
+Pod::Perldoc has been upgraded from version 3.28 to 3.2801.
+.IP \(bu 4
+The \f(CW\*(C`podlators\*(C'\fR distribution has been upgraded from version 4.09 to 4.10.
+.Sp
+Man page references and function names now follow the Linux man page
+formatting standards, instead of the Solaris standard.
+.IP \(bu 4
+POSIX has been upgraded from version 1.76 to 1.84.
+.Sp
+Some more cautions were added about using locale-specific functions in
+threaded applications.
+.IP \(bu 4
+re has been upgraded from version 0.34 to 0.36.
+.IP \(bu 4
+Scalar::Util has been upgraded from version 1.46_02 to 1.50.
+.IP \(bu 4
+SelfLoader has been upgraded from version 1.23 to 1.25.
+.IP \(bu 4
+Socket has been upgraded from version 2.020_03 to 2.027.
+.IP \(bu 4
+sort has been upgraded from version 2.02 to 2.04.
+.IP \(bu 4
+Storable has been upgraded from version 2.62 to 3.08.
+.IP \(bu 4
+Sub::Util has been upgraded from version 1.48 to 1.49.
+.IP \(bu 4
+subs has been upgraded from version 1.02 to 1.03.
+.IP \(bu 4
+Sys::Hostname has been upgraded from version 1.20 to 1.22.
+.IP \(bu 4
+Term::ReadLine has been upgraded from version 1.16 to 1.17.
+.IP \(bu 4
+Test has been upgraded from version 1.30 to 1.31.
+.IP \(bu 4
+Test::Harness has been upgraded from version 3.38 to 3.42.
+.IP \(bu 4
+Test::Simple has been upgraded from version 1.302073 to 1.302133.
+.IP \(bu 4
+threads has been upgraded from version 2.15 to 2.22.
+.Sp
+The documentation now better describes the problems that arise when
+returning values from threads, and no longer warns about creating threads
+in \f(CW\*(C`BEGIN\*(C'\fR blocks.
+[GH #11563] <https://github.com/Perl/perl5/issues/11563>
+.IP \(bu 4
+threads::shared has been upgraded from version 1.56 to 1.58.
+.IP \(bu 4
+Tie::Array has been upgraded from version 1.06 to 1.07.
+.IP \(bu 4
+Tie::StdHandle has been upgraded from version 4.4 to 4.5.
+.IP \(bu 4
+Time::gmtime has been upgraded from version 1.03 to 1.04.
+.IP \(bu 4
+Time::HiRes has been upgraded from version 1.9741 to 1.9759.
+.IP \(bu 4
+Time::localtime has been upgraded from version 1.02 to 1.03.
+.IP \(bu 4
+Time::Piece has been upgraded from version 1.31 to 1.3204.
+.IP \(bu 4
+Unicode::Collate has been upgraded from version 1.19 to 1.25.
+.IP \(bu 4
+Unicode::Normalize has been upgraded from version 1.25 to 1.26.
+.IP \(bu 4
+Unicode::UCD has been upgraded from version 0.68 to 0.70.
+.Sp
+The function \f(CW\*(C`num\*(C'\fR now accepts an optional parameter to help in
+diagnosing error returns.
+.IP \(bu 4
+User::grent has been upgraded from version 1.01 to 1.02.
+.IP \(bu 4
+User::pwent has been upgraded from version 1.00 to 1.01.
+.IP \(bu 4
+utf8 has been upgraded from version 1.19 to 1.21.
+.IP \(bu 4
+vars has been upgraded from version 1.03 to 1.04.
+.IP \(bu 4
+version has been upgraded from version 0.9917 to 0.9923.
+.IP \(bu 4
+VMS::DCLsym has been upgraded from version 1.08 to 1.09.
+.IP \(bu 4
+VMS::Stdio has been upgraded from version 2.41 to 2.44.
+.IP \(bu 4
+warnings has been upgraded from version 1.37 to 1.42.
+.Sp
+It now includes new functions with names ending in \f(CW\*(C`_at_level\*(C'\fR, allowing
+callers to specify the exact call frame.
+[GH #16257] <https://github.com/Perl/perl5/issues/16257>
+.IP \(bu 4
+XS::Typemap has been upgraded from version 0.15 to 0.16.
+.IP \(bu 4
+XSLoader has been upgraded from version 0.27 to 0.30.
+.Sp
+Its documentation now shows the use of \f(CW\*(C`_\|_PACKAGE_\|_\*(C'\fR, and direct object
+syntax for example \f(CW\*(C`DynaLoader\*(C'\fR usage
+[GH #16190] <https://github.com/Perl/perl5/issues/16190>.
+.Sp
+Platforms that use \f(CW\*(C`mod2fname\*(C'\fR to edit the names of loadable
+libraries now look for bootstrap (.bs) files under the correct,
+non-edited name.
+.SS "Removed Modules and Pragmata"
+.IX Subsection "Removed Modules and Pragmata"
+.IP \(bu 4
+The \f(CW\*(C`VMS::stdio\*(C'\fR compatibility shim has been removed.
+.SH Documentation
+.IX Header "Documentation"
+.SS "Changes to Existing Documentation"
+.IX Subsection "Changes to Existing Documentation"
+We have attempted to update the documentation to reflect the changes
+listed in this document. If you find any we have missed, send email
+to perlbug@perl.org <mailto:perlbug@perl.org>.
+.PP
+Additionally, the following selected changes have been made:
+.PP
+\fIperlapi\fR
+.IX Subsection "perlapi"
+.IP \(bu 4
+The API functions \f(CWperl_parse()\fR, \f(CWperl_run()\fR, and \f(CWperl_destruct()\fR
+are now documented comprehensively, where previously the only
+documentation was a reference to the perlembed tutorial.
+.IP \(bu 4
+The documentation of \f(CWnewGIVENOP()\fR has been belatedly updated to
+account for the removal of lexical \f(CW$_\fR.
+.IP \(bu 4
+The API functions \f(CWnewCONSTSUB()\fR and \f(CWnewCONSTSUB_flags()\fR are
+documented much more comprehensively than before.
+.PP
+\fIperldata\fR
+.IX Subsection "perldata"
+.IP \(bu 4
+The section "Truth and Falsehood" in perlsyn has been moved into
+perldata.
+.PP
+\fIperldebguts\fR
+.IX Subsection "perldebguts"
+.IP \(bu 4
+The description of the conditions under which \f(CWDB::sub()\fR will be called
+has been clarified.
+[GH #16055] <https://github.com/Perl/perl5/issues/16055>
+.PP
+\fIperldiag\fR
+.IX Subsection "perldiag"
+.IP \(bu 4
+"Variable length lookbehind not implemented in regex m/%s/" in perldiag
+.Sp
+This now gives more ideas as to workarounds to the issue that was
+introduced in Perl 5.18 (but not documented explicitly in its perldelta)
+for the fact that some Unicode \f(CW\*(C`/i\*(C'\fR rules cause a few sequences such as
+.Sp
+.Vb 1
+\& (?<!st)
+.Ve
+.Sp
+to be considered variable length, and hence disallowed.
+.IP \(bu 4
+"Use of state \f(CW$_\fR is experimental" in perldiag
+.Sp
+This entry has been removed, as the experimental support of this construct was
+removed in perl 5.24.0.
+.IP \(bu 4
+The diagnostic \f(CW\*(C`Initialization of state variables in list context
+currently forbidden\*(C'\fR has changed to \f(CW\*(C`Initialization of state variables
+in list currently forbidden\*(C'\fR, because list-context initialization of
+single aggregate state variables is now permitted.
+.PP
+\fIperlembed\fR
+.IX Subsection "perlembed"
+.IP \(bu 4
+The examples in perlembed have been made more portable in the way
+they exit, and the example that gets an exit code from the embedded Perl
+interpreter now gets it from the right place. The examples that pass
+a constructed argv to Perl now show the mandatory null \f(CW\*(C`argv[argc]\*(C'\fR.
+.IP \(bu 4
+An example in perlembed used the string value of \f(CW\*(C`ERRSV\*(C'\fR as a
+format string when calling \fBcroak()\fR. If that string contains format
+codes such as \f(CW%s\fR this could crash the program.
+.Sp
+This has been changed to a call to \fBcroak_sv()\fR.
+.Sp
+An alternative could have been to supply a trivial format string:
+.Sp
+.Vb 1
+\& croak("%s", SvPV_nolen(ERRSV));
+.Ve
+.Sp
+or as a special case for \f(CW\*(C`ERRSV\*(C'\fR simply:
+.Sp
+.Vb 1
+\& croak(NULL);
+.Ve
+.PP
+\fIperlfunc\fR
+.IX Subsection "perlfunc"
+.IP \(bu 4
+There is now a note that warnings generated by built-in functions are
+documented in perldiag and warnings.
+[GH #12642] <https://github.com/Perl/perl5/issues/12642>
+.IP \(bu 4
+The documentation for the \f(CW\*(C`exists\*(C'\fR operator no longer says that
+autovivification behaviour "may be fixed in a future release".
+We've determined that we're not going to change the default behaviour.
+[GH #15231] <https://github.com/Perl/perl5/issues/15231>
+.IP \(bu 4
+A couple of small details in the documentation for the \f(CW\*(C`bless\*(C'\fR operator
+have been clarified.
+[GH #14684] <https://github.com/Perl/perl5/issues/14684>
+.IP \(bu 4
+The description of \f(CW@INC\fR hooks in the documentation for \f(CW\*(C`require\*(C'\fR
+has been corrected to say that filter subroutines receive a useless
+first argument.
+[GH #12569] <https://github.com/Perl/perl5/issues/12569>
+.IP \(bu 4
+The documentation of \f(CW\*(C`ref\*(C'\fR has been rewritten for clarity.
+.IP \(bu 4
+The documentation of \f(CW\*(C`use\*(C'\fR now explains what syntactically qualifies
+as a version number for its module version checking feature.
+.IP \(bu 4
+The documentation of \f(CW\*(C`warn\*(C'\fR has been updated to reflect that since Perl
+5.14 it has treated complex exception objects in a manner equivalent
+to \f(CW\*(C`die\*(C'\fR.
+[GH #13641] <https://github.com/Perl/perl5/issues/13641>
+.IP \(bu 4
+The documentation of \f(CW\*(C`die\*(C'\fR and \f(CW\*(C`warn\*(C'\fR has been revised for clarity.
+.IP \(bu 4
+The documentation of \f(CW\*(C`each\*(C'\fR has been improved, with a slightly more
+explicit description of the sharing of iterator state, and with
+caveats regarding the fragility of while-each loops.
+[GH #16334] <https://github.com/Perl/perl5/issues/16334>
+.IP \(bu 4
+Clarification to \f(CW\*(C`require\*(C'\fR was added to explain the differences between
+.Sp
+.Vb 2
+\& require Foo::Bar;
+\& require "Foo/Bar.pm";
+.Ve
+.PP
+\fIperlgit\fR
+.IX Subsection "perlgit"
+.IP \(bu 4
+The precise rules for identifying \f(CW\*(C`smoke\-me\*(C'\fR branches are now stated.
+.PP
+\fIperlguts\fR
+.IX Subsection "perlguts"
+.IP \(bu 4
+The section on reference counting in perlguts has been heavily revised,
+to describe references in the way a programmer needs to think about them
+rather than in terms of the physical data structures.
+.IP \(bu 4
+Improve documentation related to UTF\-8 multibytes.
+.PP
+\fIperlintern\fR
+.IX Subsection "perlintern"
+.IP \(bu 4
+The internal functions \f(CWnewXS_len_flags()\fR and \f(CWnewATTRSUB_x()\fR are
+now documented.
+.PP
+\fIperlobj\fR
+.IX Subsection "perlobj"
+.IP \(bu 4
+The documentation about \f(CW\*(C`DESTROY\*(C'\fR methods has been corrected, updated,
+and revised, especially in regard to how they interact with exceptions.
+[GH #14083] <https://github.com/Perl/perl5/issues/14083>
+.PP
+\fIperlop\fR
+.IX Subsection "perlop"
+.IP \(bu 4
+The description of the \f(CW\*(C`x\*(C'\fR operator in perlop has been clarified.
+[GH #16253] <https://github.com/Perl/perl5/issues/16253>
+.IP \(bu 4
+perlop has been updated to note that \f(CW\*(C`qw\*(C'\fR's whitespace rules differ
+from that of \f(CW\*(C`split\*(C'\fR's in that only ASCII whitespace is used.
+.IP \(bu 4
+The general explanation of operator precedence and associativity has
+been corrected and clarified.
+[GH #15153] <https://github.com/Perl/perl5/issues/15153>
+.IP \(bu 4
+The documentation for the \f(CW\*(C`\e\*(C'\fR referencing operator now explains the
+unusual context that it supplies to its operand.
+[GH #15932] <https://github.com/Perl/perl5/issues/15932>
+.PP
+\fIperlrequick\fR
+.IX Subsection "perlrequick"
+.IP \(bu 4
+Clarifications on metacharacters and character classes
+.PP
+\fIperlretut\fR
+.IX Subsection "perlretut"
+.IP \(bu 4
+Clarify metacharacters.
+.PP
+\fIperlrun\fR
+.IX Subsection "perlrun"
+.IP \(bu 4
+Clarify the differences between \fB\-M\fR and \fB\-m\fR.
+[GH #15998] <https://github.com/Perl/perl5/issues/15998>
+.PP
+\fIperlsec\fR
+.IX Subsection "perlsec"
+.IP \(bu 4
+The documentation about set-id scripts has been updated and revised.
+[GH #10289] <https://github.com/Perl/perl5/issues/10289>
+.IP \(bu 4
+A section about using \f(CW\*(C`sudo\*(C'\fR to run Perl scripts has been added.
+.PP
+\fIperlsyn\fR
+.IX Subsection "perlsyn"
+.IP \(bu 4
+The section "Truth and Falsehood" in perlsyn has been removed from
+that document, where it didn't belong, and merged into the existing
+paragraph on the same topic in perldata.
+.IP \(bu 4
+The means to disambiguate between code blocks and hash constructors,
+already documented in perlref, are now documented in perlsyn too.
+[GH #15918] <https://github.com/Perl/perl5/issues/15918>
+.PP
+\fIperluniprops\fR
+.IX Subsection "perluniprops"
+.IP \(bu 4
+perluniprops has been updated to note that \f(CW\*(C`\ep{Word}\*(C'\fR now includes
+code points matching the \f(CW\*(C`\ep{Join_Control}\*(C'\fR property. The change to
+the property was made in Perl 5.18, but not documented until now. There
+are currently only two code points that match this property U+200C (ZERO
+WIDTH NON-JOINER) and U+200D (ZERO WIDTH JOINER).
+.IP \(bu 4
+For each binary table or property, the documentation now includes which
+characters in the range \f(CW\*(C`\ex00\-\exFF\*(C'\fR it matches, as well as a list of
+the first few ranges of code points matched above that.
+.PP
+\fIperlvar\fR
+.IX Subsection "perlvar"
+.IP \(bu 4
+The entry for \f(CW$+\fR in perlvar has been expanded upon to describe handling of
+multiply-named capturing groups.
+.PP
+\fIperlfunc, perlop, perlsyn\fR
+.IX Subsection "perlfunc, perlop, perlsyn"
+.IP \(bu 4
+In various places, improve the documentation of the special cases
+in the condition expression of a while loop, such as implicit \f(CW\*(C`defined\*(C'\fR
+and assignment to \f(CW$_\fR.
+[GH #16334] <https://github.com/Perl/perl5/issues/16334>
+.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
+Can't "goto" into a "given" block
+.Sp
+(F) A "goto" statement was executed to jump into the middle of a \f(CW\*(C`given\*(C'\fR
+block. You can't get there from here. See "goto" in perlfunc.
+.IP \(bu 4
+Can't "goto" into a binary or list expression
+.Sp
+Use of \f(CW\*(C`goto\*(C'\fR to jump into the parameter of a binary or list operator has
+been prohibited, to prevent crashes and stack corruption.
+[GH #15914] <https://github.com/Perl/perl5/issues/15914>
+.Sp
+You may only enter the \fIfirst\fR argument of an operator that takes a fixed
+number of arguments, since this is a case that will not cause stack
+corruption.
+[GH #16415] <https://github.com/Perl/perl5/issues/16415>
+.PP
+\fINew Warnings\fR
+.IX Subsection "New Warnings"
+.IP \(bu 4
+Old package separator used in string
+.Sp
+(W syntax) You used the old package separator, "'", in a variable
+named inside a double-quoted string; e.g., \f(CW"In $name\*(Aqs house"\fR. This
+is equivalent to \f(CW"In $name::s house"\fR. If you meant the former, put
+a backslash before the apostrophe (\f(CW"In $name\e\*(Aqs house"\fR).
+.IP \(bu 4
+"Locale '%s' contains (at least) the following characters which
+have unexpected meanings: \f(CW%s\fR The Perl program will use the expected
+meanings" in perldiag
+.SS "Changes to Existing Diagnostics"
+.IX Subsection "Changes to Existing Diagnostics"
+.IP \(bu 4
+A false-positive warning that was issued when using a
+numerically-quantified sub-pattern in a recursive regex has been
+silenced. [GH #16106] <https://github.com/Perl/perl5/issues/16106>
+.IP \(bu 4
+The warning about useless use of a concatenation operator in void context
+is now generated for expressions with multiple concatenations, such as
+\&\f(CW\*(C`$a.$b.$c\*(C'\fR, which used to mistakenly not warn.
+[GH #3990] <https://github.com/Perl/perl5/issues/3990>
+.IP \(bu 4
+Warnings that a variable or subroutine "masks earlier declaration in same
+\&...", or that an \f(CW\*(C`our\*(C'\fR variable has been redeclared, have been moved to a
+new warnings category "shadow". Previously they were in category "misc".
+.IP \(bu 4
+The deprecation warning from \f(CWSys::Hostname::hostname()\fR saying that
+it doesn't accept arguments now states the Perl version in which the
+warning will be upgraded to an error.
+[GH #14662] <https://github.com/Perl/perl5/issues/14662>
+.IP \(bu 4
+The perldiag entry for the error regarding a set-id script has been
+expanded to make clear that the error is reporting a specific security
+vulnerability, and to advise how to fix it.
+.IP \(bu 4
+The \f(CW\*(C`Unable to flush stdout\*(C'\fR error message was missing a trailing
+newline. [debian #875361]
+.SH "Utility Changes"
+.IX Header "Utility Changes"
+.SS perlbug
+.IX Subsection "perlbug"
+.IP \(bu 4
+\&\f(CW\*(C`\-\-help\*(C'\fR and \f(CW\*(C`\-\-version\*(C'\fR options have been added.
+.SH "Configuration and Compilation"
+.IX Header "Configuration and Compilation"
+.IP \(bu 4
+C89 requirement
+.Sp
+Perl has been documented as requiring a C89 compiler to build since October
+1998. A variety of simplifications have now been made to Perl's internals to
+rely on the features specified by the C89 standard. We believe that this
+internal change hasn't altered the set of platforms that Perl builds on, but
+please report a bug if Perl now has new problems building on your platform.
+.IP \(bu 4
+On GCC, \f(CW\*(C`\-Werror=pointer\-arith\*(C'\fR is now enabled by default,
+disallowing arithmetic on void and function pointers.
+.IP \(bu 4
+Where an HTML version of the documentation is installed, the HTML
+documents now use relative links to refer to each other. Links from
+the index page of perlipc to the individual section documents are
+now correct.
+[GH #11941] <https://github.com/Perl/perl5/issues/11941>
+.IP \(bu 4
+\&\fIlib/unicore/mktables\fR now correctly canonicalizes the names of the
+dependencies stored in the files it generates.
+.Sp
+\&\fIregen/mk_invlists.pl\fR, unlike the other \fIregen/*.pl\fR scripts, used
+\&\f(CW$0\fR to name itself in the dependencies stored in the files it
+generates. It now uses a literal so that the path stored in the
+generated files doesn't depend on how \fIregen/mk_invlists.pl\fR is
+invoked.
+.Sp
+This lack of canonical names could cause test failures in \fIt/porting/regen.t\fR.
+[GH #16446] <https://github.com/Perl/perl5/issues/16446>
+.IP \(bu 4
+New probes
+.RS 4
+.IP HAS_BUILTIN_ADD_OVERFLOW 2
+.IX Item "HAS_BUILTIN_ADD_OVERFLOW"
+.PD 0
+.IP HAS_BUILTIN_MUL_OVERFLOW 2
+.IX Item "HAS_BUILTIN_MUL_OVERFLOW"
+.IP HAS_BUILTIN_SUB_OVERFLOW 2
+.IX Item "HAS_BUILTIN_SUB_OVERFLOW"
+.IP HAS_THREAD_SAFE_NL_LANGINFO_L 2
+.IX Item "HAS_THREAD_SAFE_NL_LANGINFO_L"
+.IP HAS_LOCALECONV_L 2
+.IX Item "HAS_LOCALECONV_L"
+.IP HAS_MBRLEN 2
+.IX Item "HAS_MBRLEN"
+.IP HAS_MBRTOWC 2
+.IX Item "HAS_MBRTOWC"
+.IP HAS_MEMRCHR 2
+.IX Item "HAS_MEMRCHR"
+.IP HAS_NANOSLEEP 2
+.IX Item "HAS_NANOSLEEP"
+.IP HAS_STRNLEN 2
+.IX Item "HAS_STRNLEN"
+.IP HAS_STRTOLD_L 2
+.IX Item "HAS_STRTOLD_L"
+.IP I_WCHAR 2
+.IX Item "I_WCHAR"
+.RE
+.RS 4
+.RE
+.PD
+.SH Testing
+.IX Header "Testing"
+.IP \(bu 4
+Testing of the XS-APItest directory is now done in parallel, where
+applicable.
+.IP \(bu 4
+Perl now includes a default \fI.travis.yml\fR file for Travis CI testing
+on github mirrors.
+[GH #14558] <https://github.com/Perl/perl5/issues/14558>
+.IP \(bu 4
+The watchdog timer count in \fIre/pat_psycho.t\fR can now be overridden.
+.Sp
+This test can take a long time to run, so there is a timer to keep
+this in check (currently, 5 minutes). This commit adds checking
+the environment variable \f(CW\*(C`PERL_TEST_TIME_OUT_FACTOR\*(C'\fR; if set,
+the time out setting is multiplied by its value.
+.IP \(bu 4
+\&\fIharness\fR no longer waits for 30 seconds when running \fIt/io/openpid.t\fR.
+[GH #13535] <https://github.com/Perl/perl5/issues/13535>
+[GH #16420] <https://github.com/Perl/perl5/issues/16420>
+.SH Packaging
+.IX Header "Packaging"
+For the past few years we have released perl using three different archive
+formats: bzip (\f(CW\*(C`.bz2\*(C'\fR), LZMA2 (\f(CW\*(C`.xz\*(C'\fR) and gzip (\f(CW\*(C`.gz\*(C'\fR). Since xz compresses
+better and decompresses faster, and gzip is more compatible and uses less
+memory, we have dropped the \f(CW\*(C`.bz2\*(C'\fR archive format with this release.
+(If this poses a problem, do let us know; see "Reporting Bugs", below.)
+.SH "Platform Support"
+.IX Header "Platform Support"
+.SS "Discontinued Platforms"
+.IX Subsection "Discontinued Platforms"
+.IP "PowerUX / Power MAX OS" 4
+.IX Item "PowerUX / Power MAX OS"
+Compiler hints and other support for these apparently long-defunct
+platforms has been removed.
+.SS "Platform-Specific Notes"
+.IX Subsection "Platform-Specific Notes"
+.IP CentOS 4
+.IX Item "CentOS"
+Compilation on CentOS 5 is now fixed.
+.IP Cygwin 4
+.IX Item "Cygwin"
+A build with the quadmath library can now be done on Cygwin.
+.IP Darwin 4
+.IX Item "Darwin"
+Perl now correctly uses reentrant functions, like \f(CW\*(C`asctime_r\*(C'\fR, on
+versions of Darwin that have support for them.
+.IP FreeBSD 4
+.IX Item "FreeBSD"
+FreeBSD's \fI/usr/share/mk/sys.mk\fR specifies \f(CW\*(C`\-O2\*(C'\fR for
+architectures other than ARM and MIPS. By default, perl is now compiled
+with the same optimization levels.
+.IP VMS 4
+.IX Item "VMS"
+Several fix-ups for \fIconfigure.com\fR, marking function VMS has
+(or doesn't have).
+.Sp
+CRTL features can now be set by embedders before invoking Perl by using
+the \f(CW\*(C`decc$feature_set\*(C'\fR and \f(CW\*(C`decc$feature_set_value\*(C'\fR functions.
+Previously any attempt to set features after image initialization were
+ignored.
+.IP Windows 4
+.IX Item "Windows"
+.RS 4
+.PD 0
+.IP \(bu 4
+.PD
+Support for compiling perl on Windows using Microsoft Visual Studio 2017
+(containing Visual C++ 14.1) has been added.
+.IP \(bu 4
+Visual C++ compiler version detection has been improved to work on non-English
+language systems.
+.IP \(bu 4
+We now set \f(CW$Config{libpth}\fR correctly for 64\-bit builds using Visual C++
+versions earlier than 14.1.
+.RE
+.RS 4
+.RE
+.SH "Internal Changes"
+.IX Header "Internal Changes"
+.IP \(bu 4
+A new optimisation phase has been added to the compiler,
+\&\f(CWoptimize_optree()\fR, which does a top-down scan of a complete optree
+just before the peephole optimiser is run. This phase is not currently
+hookable.
+.IP \(bu 4
+An \f(CW\*(C`OP_MULTICONCAT\*(C'\fR op has been added. At \f(CWoptimize_optree()\fR time, a
+chain of \f(CW\*(C`OP_CONCAT\*(C'\fR and \f(CW\*(C`OP_CONST\*(C'\fR ops, together optionally with an
+\&\f(CW\*(C`OP_STRINGIFY\*(C'\fR and/or \f(CW\*(C`OP_SASSIGN\*(C'\fR, are combined into a single
+\&\f(CW\*(C`OP_MULTICONCAT\*(C'\fR op. The op is of type \f(CW\*(C`UNOP_AUX\*(C'\fR, and the aux array
+contains the argument count, plus a pointer to a constant string and a set
+of segment lengths. For example with
+.Sp
+.Vb 1
+\& my $x = "foo=$foo, bar=$bar\en";
+.Ve
+.Sp
+the constant string would be \f(CW"foo=, bar=\en"\fR and the segment lengths
+would be (4,6,1). If the string contains characters such as \f(CW\*(C`\ex80\*(C'\fR, whose
+representation changes under utf8, two sets of strings plus lengths are
+precomputed and stored.
+.IP \(bu 4
+Direct access to \f(CW\*(C`PL_keyword_plugin\*(C'\fR is not
+safe in the presence of multithreading. A new
+\&\f(CW\*(C`wrap_keyword_plugin\*(C'\fR function has been
+added to allow XS modules to safely define custom keywords even when
+loaded from a thread, analogous to \f(CW\*(C`PL_check\*(C'\fR /
+\&\f(CW\*(C`wrap_op_checker\*(C'\fR.
+.IP \(bu 4
+The \f(CW\*(C`PL_statbuf\*(C'\fR interpreter variable has been removed.
+.IP \(bu 4
+The deprecated function \f(CWto_utf8_case()\fR, accessible from XS code, has
+been removed.
+.IP \(bu 4
+A new function
+\&\f(CWis_utf8_invariant_string_loc()\fR
+has been added that is like
+\&\f(CWis_utf8_invariant_string()\fR
+but takes an extra pointer parameter into which is stored the location
+of the first variant character, if any are found.
+.IP \(bu 4
+A new function, \f(CWPerl_langinfo()\fR has been
+added. It is an (almost) drop-in replacement for the system
+\&\f(CWnl_langinfo(3)\fR, but works on platforms that lack that; as well as
+being more thread-safe, and hiding some gotchas with locale handling
+from the caller. Code that uses this, needn't use \f(CWlocaleconv(3)\fR
+(and be affected by the gotchas) to find the decimal point, thousands
+separator, or currency symbol. See "Perl_langinfo" in perlapi.
+.IP \(bu 4
+A new API function \f(CWsv_rvunweaken()\fR has
+been added to complement \f(CWsv_rvweaken()\fR.
+The implementation was taken from "unweaken" in Scalar::Util.
+.IP \(bu 4
+A new flag, \f(CW\*(C`SORTf_UNSTABLE\*(C'\fR, has been added. This will allow a
+future commit to make mergesort unstable when the user specifies ‘no
+sort stable’, since it has been decided that mergesort should remain
+stable by default.
+.IP \(bu 4
+XS modules can now automatically get reentrant versions of system
+functions on threaded perls.
+.Sp
+By adding
+.Sp
+.Vb 1
+\& #define PERL_REENTRANT
+.Ve
+.Sp
+near the beginning of an \f(CW\*(C`XS\*(C'\fR file, it will be compiled so that
+whatever reentrant functions perl knows about on that system will
+automatically and invisibly be used instead of the plain, non-reentrant
+versions. For example, if you write \f(CWgetpwnam()\fR in your code, on a
+system that has \f(CWgetpwnam_r()\fR all calls to the former will be translated
+invisibly into the latter. This does not happen except on threaded
+perls, as they aren't needed otherwise. Be aware that which functions
+have reentrant versions varies from system to system.
+.IP \(bu 4
+The \f(CW\*(C`PERL_NO_OP_PARENT\*(C'\fR build define is no longer supported, which means
+that perl is now always built with \f(CW\*(C`PERL_OP_PARENT\*(C'\fR enabled.
+.IP \(bu 4
+The format and content of the non\-utf8 transliteration table attached to
+the \f(CW\*(C`op_pv\*(C'\fR field of \f(CW\*(C`OP_TRANS\*(C'\fR/\f(CW\*(C`OP_TRANSR\*(C'\fR ops has changed. It's now a
+\&\f(CW\*(C`struct OPtrans_map\*(C'\fR.
+.IP \(bu 4
+A new compiler \f(CW\*(C`#define\*(C'\fR, \f(CW\*(C`dTHX_DEBUGGING\*(C'\fR. has been added. This is
+useful for XS or C code that only need the thread context because their
+debugging statements that get compiled only under \f(CW\*(C`\-DDEBUGGING\*(C'\fR need
+one.
+.IP \(bu 4
+A new API function "Perl_setlocale" in perlapi has been added.
+.IP \(bu 4
+"sync_locale" in perlapi has been revised to return a boolean as to
+whether the system was using the global locale or not.
+.IP \(bu 4
+A new kind of magic scalar, called a "nonelem" scalar, has been introduced.
+It is stored in an array to denote a non-existent element, whenever such an
+element is accessed in a potential lvalue context. It replaces the
+existing "defelem" (deferred element) magic wherever this is possible,
+being significantly more efficient. This means that
+\&\f(CWsome_sub($sparse_array[$nonelem])\fR no longer has to create a new magic
+defelem scalar each time, as long as the element is within the array.
+.Sp
+It partially fixes the rare bug of deferred elements getting out of synch
+with their arrays when the array is shifted or unshifted.
+[GH #16364] <https://github.com/Perl/perl5/issues/16364>
+.SH "Selected Bug Fixes"
+.IX Header "Selected Bug Fixes"
+.IP \(bu 4
+List assignment (\f(CW\*(C`aassign\*(C'\fR) could in some rare cases allocate an
+entry on the mortals stack and leave the entry uninitialized, leading to
+possible crashes.
+[GH #16017] <https://github.com/Perl/perl5/issues/16017>
+.IP \(bu 4
+Attempting to apply an attribute to an \f(CW\*(C`our\*(C'\fR variable where a
+function of that name already exists could result in a NULL pointer
+being supplied where an SV was expected, crashing perl.
+[perl #131597] <https://rt.perl.org/Ticket/Display.html?id=131597>
+.IP \(bu 4
+\&\f(CW\*(C`split \*(Aq \*(Aq\*(C'\fR now correctly handles the argument being split when in the
+scope of the \f(CW\*(C`unicode_strings\*(C'\fR feature. Previously, when a string using the single-byte internal
+representation contained characters that are whitespace by Unicode rules but
+not by ASCII rules, it treated those characters as part of fields rather
+than as field separators.
+[GH #15904] <https://github.com/Perl/perl5/issues/15904>
+.IP \(bu 4
+Several built-in functions previously had bugs that could cause them to
+write to the internal stack without allocating room for the item being
+written. In rare situations, this could have led to a crash. These bugs have
+now been fixed, and if any similar bugs are introduced in future, they will
+be detected automatically in debugging builds.
+.Sp
+These internal stack usage checks introduced are also done
+by the \f(CW\*(C`entersub\*(C'\fR operator when calling XSUBs. This means we can
+report which XSUB failed to allocate enough stack space.
+[GH #16126] <https://github.com/Perl/perl5/issues/16126>
+.IP \(bu 4
+Using a symbolic ref with postderef syntax as the key in a hash lookup was
+yielding an assertion failure on debugging builds.
+[GH #16029] <https://github.com/Perl/perl5/issues/16029>
+.IP \(bu 4
+Array and hash variables whose names begin with a caret now admit indexing
+inside their curlies when interpolated into strings, as in \f(CW"${^CAPTURE[0]}"\fR to index \f(CW\*(C`@{^CAPTURE}\*(C'\fR.
+[GH #16050] <https://github.com/Perl/perl5/issues/16050>
+.IP \(bu 4
+Fetching the name of a glob that was previously UTF\-8 but wasn't any
+longer would return that name flagged as UTF\-8.
+[GH #15971] <https://github.com/Perl/perl5/issues/15971>
+.IP \(bu 4
+The perl \f(CWsprintf()\fR function (via the underlying C function
+\&\f(CWPerl_sv_vcatpvfn_flags()\fR) has been heavily reworked to fix many minor
+bugs, including the integer wrapping of large width and precision
+specifiers and potential buffer overruns. It has also been made faster in
+many cases.
+.IP \(bu 4
+Exiting from an \f(CW\*(C`eval\*(C'\fR, whether normally or via an exception, now always
+frees temporary values (possibly calling destructors) \fIbefore\fR setting
+\&\f(CW$@\fR. For example:
+.Sp
+.Vb 3
+\& sub DESTROY { eval { die "died in DESTROY"; } }
+\& eval { bless []; };
+\& # $@ used to be equal to "died in DESTROY" here; it\*(Aqs now "".
+.Ve
+.IP \(bu 4
+Fixed a duplicate symbol failure with \f(CW\*(C`\-flto \-mieee\-fp\*(C'\fR builds.
+\&\fIpp.c\fR defined \f(CW\*(C`_LIB_VERSION\*(C'\fR which \f(CW\*(C`\-lieee\*(C'\fR already defines.
+[GH #16086] <https://github.com/Perl/perl5/issues/16086>
+.IP \(bu 4
+The tokenizer no longer consumes the exponent part of a floating
+point number if it's incomplete.
+[GH #16073] <https://github.com/Perl/perl5/issues/16073>
+.IP \(bu 4
+On non-threaded builds, for \f(CW\*(C`m/$null/\*(C'\fR where \f(CW$null\fR is an empty
+string is no longer treated as if the \f(CW\*(C`/o\*(C'\fR flag was present when the
+previous matching match operator included the \f(CW\*(C`/o\*(C'\fR flag. The
+rewriting used to implement this behavior could confuse the
+interpreter. This matches the behaviour of threaded builds.
+[GH #14668] <https://github.com/Perl/perl5/issues/14668>
+.IP \(bu 4
+Parsing a \f(CW\*(C`sub\*(C'\fR definition could cause a use after free if the \f(CW\*(C`sub\*(C'\fR
+keyword was followed by whitespace including newlines (and comments.)
+[GH #16097] <https://github.com/Perl/perl5/issues/16097>
+.IP \(bu 4
+The tokenizer now correctly adjusts a parse pointer when skipping
+whitespace in a \f(CW\*(C`${identifier}\*(C'\fR construct.
+[perl #131949] <https://rt.perl.org/Public/Bug/Display.html?id=131949>
+.IP \(bu 4
+Accesses to \f(CW\*(C`${^LAST_FH}\*(C'\fR no longer assert after using any of a
+variety of I/O operations on a non-glob.
+[GH #15372] <https://github.com/Perl/perl5/issues/15372>
+.IP \(bu 4
+The XS-level \f(CWCopy()\fR, \f(CWMove()\fR, \f(CWZero()\fR macros and their variants now
+assert if the pointers supplied are \f(CW\*(C`NULL\*(C'\fR. ISO C considers
+supplying NULL pointers to the functions these macros are built upon
+as undefined behaviour even when their count parameters are zero.
+Based on these assertions and the original bug report three macro
+calls were made conditional.
+[GH #16079] <https://github.com/Perl/perl5/issues/16079>
+[GH #16112] <https://github.com/Perl/perl5/issues/16112>
+.IP \(bu 4
+Only the \f(CW\*(C`=\*(C'\fR operator is permitted for defining defaults for
+parameters in subroutine signatures. Previously other assignment
+operators, e.g. \f(CW\*(C`+=\*(C'\fR, were also accidentally permitted.
+[GH #16084] <https://github.com/Perl/perl5/issues/16084>
+.IP \(bu 4
+Package names are now always included in \f(CW\*(C`:prototype\*(C'\fR warnings
+[perl #131833] <https://rt.perl.org/Public/Bug/Display.html?id=131833>
+.IP \(bu 4
+The \f(CW\*(C`je_old_stack_hwm\*(C'\fR field, previously only found in the \f(CW\*(C`jmpenv\*(C'\fR
+structure on debugging builds, has been added to non-debug builds as
+well. This fixes an issue with some CPAN modules caused by the size of
+this structure varying between debugging and non-debugging builds.
+[GH #16122] <https://github.com/Perl/perl5/issues/16122>
+.IP \(bu 4
+The arguments to the \f(CWninstr()\fR macro are now correctly parenthesized.
+.IP \(bu 4
+A NULL pointer dereference in the \f(CWS_regmatch()\fR function has been
+fixed.
+[perl #132017] <https://rt.perl.org/Public/Bug/Display.html?id=132017>
+.IP \(bu 4
+Calling exec PROGRAM LIST with an empty \f(CW\*(C`LIST\*(C'\fR
+has been fixed. This should call \f(CWexecvp()\fR with an empty \f(CW\*(C`argv\*(C'\fR array
+(containing only the terminating \f(CW\*(C`NULL\*(C'\fR pointer), but was instead just
+returning false (and not setting \f(CW$!\fR).
+[GH #16075] <https://github.com/Perl/perl5/issues/16075>
+.IP \(bu 4
+The \f(CW\*(C`gv_fetchmeth_sv\*(C'\fR C function stopped working properly in Perl 5.22 when
+fetching a constant with a UTF\-8 name if that constant subroutine was stored in
+the stash as a simple scalar reference, rather than a full typeglob. This has
+been corrected.
+.IP \(bu 4
+Single-letter debugger commands followed by an argument which starts with
+punctuation (e.g. \f(CW\*(C`p$^V\*(C'\fR and \f(CW\*(C`x@ARGV\*(C'\fR) now work again. They had been
+wrongly requiring a space between the command and the argument.
+[GH #13342] <https://github.com/Perl/perl5/issues/13342>
+.IP \(bu 4
+splice now throws an exception
+("Modification of a read-only value attempted") when modifying a read-only
+array. Until now it had been silently modifying the array. The new behaviour
+is consistent with the behaviour of push and
+unshift.
+[GH #15923] <https://github.com/Perl/perl5/issues/15923>
+.IP \(bu 4
+\&\f(CWstat()\fR, \f(CWlstat()\fR, and file test operators now fail if given a
+filename containing a nul character, in the same way that \f(CWopen()\fR
+already fails.
+.IP \(bu 4
+\&\f(CWstat()\fR, \f(CWlstat()\fR, and file test operators now reliably set \f(CW$!\fR when
+failing due to being applied to a closed or otherwise invalid file handle.
+.IP \(bu 4
+File test operators for Unix permission bits that don't exist on a
+particular platform, such as \f(CW\*(C`\-k\*(C'\fR (sticky bit) on Windows, now check that
+the file being tested exists before returning the blanket false result,
+and yield the appropriate errors if the argument doesn't refer to a file.
+.IP \(bu 4
+Fixed a 'read before buffer' overrun when parsing a range starting with
+\&\f(CW\*(C`\eN{}\*(C'\fR at the beginning of the character set for the transliteration
+operator.
+[GH #16189] <https://github.com/Perl/perl5/issues/16189>
+.IP \(bu 4
+Fixed a leaked scalar when parsing an empty \f(CW\*(C`\eN{}\*(C'\fR at compile-time.
+[GH #16189] <https://github.com/Perl/perl5/issues/16189>
+.IP \(bu 4
+Calling \f(CW\*(C`do $path\*(C'\fR on a directory or block device now yields a meaningful
+error code in \f(CW$!\fR.
+[GH #14841] <https://github.com/Perl/perl5/issues/14841>
+.IP \(bu 4
+Regexp substitution using an overloaded replacement value that provides
+a tainted stringification now correctly taints the resulting string.
+[GH #12495] <https://github.com/Perl/perl5/issues/12495>
+.IP \(bu 4
+Lexical sub declarations in \f(CW\*(C`do\*(C'\fR blocks such as \f(CW\*(C`do { my sub lex; 123 }\*(C'\fR
+could corrupt the stack, erasing items already on the stack in the
+enclosing statement. This has been fixed.
+[GH #16243] <https://github.com/Perl/perl5/issues/16243>
+.IP \(bu 4
+\&\f(CW\*(C`pack\*(C'\fR and \f(CW\*(C`unpack\*(C'\fR can now handle repeat counts and lengths that
+exceed two billion.
+[GH #13179] <https://github.com/Perl/perl5/issues/13179>
+.IP \(bu 4
+Digits past the radix point in octal and binary floating point literals
+now have the correct weight on platforms where a floating point
+significand doesn't fit into an integer type.
+.IP \(bu 4
+The canonical truth value no longer has a spurious special meaning as a
+callable subroutine. It used to be a magic placeholder for a missing
+\&\f(CW\*(C`import\*(C'\fR or \f(CW\*(C`unimport\*(C'\fR method, but is now treated like any other string
+\&\f(CW1\fR.
+[GH #14902] <https://github.com/Perl/perl5/issues/14902>
+.IP \(bu 4
+\&\f(CW\*(C`system\*(C'\fR now reduces its arguments to strings in the parent process, so
+any effects of stringifying them (such as overload methods being called
+or warnings being emitted) are visible in the way the program expects.
+[GH #13561] <https://github.com/Perl/perl5/issues/13561>
+.IP \(bu 4
+The \f(CWreadpipe()\fR built-in function now checks at compile time that
+it has only one parameter expression, and puts it in scalar context,
+thus ensuring that it doesn't corrupt the stack at runtime.
+[GH #2793] <https://github.com/Perl/perl5/issues/2793>
+.IP \(bu 4
+\&\f(CW\*(C`sort\*(C'\fR now performs correct reference counting when aliasing \f(CW$a\fR and
+\&\f(CW$b\fR, thus avoiding premature destruction and leakage of scalars if they
+are re-aliased during execution of the sort comparator.
+[GH #11422] <https://github.com/Perl/perl5/issues/11422>
+.IP \(bu 4
+\&\f(CW\*(C`reverse\*(C'\fR with no operand, reversing \f(CW$_\fR by default, is no longer in
+danger of corrupting the stack.
+[GH #16291] <https://github.com/Perl/perl5/issues/16291>
+.IP \(bu 4
+\&\f(CW\*(C`exec\*(C'\fR, \f(CW\*(C`system\*(C'\fR, et al are no longer liable to have their argument
+lists corrupted by reentrant calls and by magic such as tied scalars.
+[GH #15660] <https://github.com/Perl/perl5/issues/15660>
+.IP \(bu 4
+Perl's own \f(CW\*(C`malloc\*(C'\fR no longer gets confused by attempts to allocate
+more than a gigabyte on a 64\-bit platform.
+[GH #13273] <https://github.com/Perl/perl5/issues/13273>
+.IP \(bu 4
+Stacked file test operators in a sort comparator expression no longer
+cause a crash.
+[GH #15626] <https://github.com/Perl/perl5/issues/15626>
+.IP \(bu 4
+An identity \f(CW\*(C`tr///\*(C'\fR transformation on a reference is no longer mistaken
+for that reference for the purposes of deciding whether it can be
+assigned to.
+[GH #15812] <https://github.com/Perl/perl5/issues/15812>
+.IP \(bu 4
+Lengthy hexadecimal, octal, or binary floating point literals no
+longer cause undefined behaviour when parsing digits that are of such
+low significance that they can't affect the floating point value.
+[GH #16114] <https://github.com/Perl/perl5/issues/16114>
+.IP \(bu 4
+\&\f(CW\*(C`open $$scalarref...\*(C'\fR and similar invocations no longer leak the file
+handle.
+[GH #12593] <https://github.com/Perl/perl5/issues/12593>
+.IP \(bu 4
+Some convoluted kinds of regexp no longer cause an arithmetic overflow
+when compiled.
+[GH #16113] <https://github.com/Perl/perl5/issues/16113>
+.IP \(bu 4
+The default typemap, by avoiding \f(CW\*(C`newGVgen\*(C'\fR, now no longer leaks when
+XSUBs return file handles (\f(CW\*(C`PerlIO *\*(C'\fR or \f(CW\*(C`FILE *\*(C'\fR).
+[GH #12593] <https://github.com/Perl/perl5/issues/12593>
+.IP \(bu 4
+Creating a \f(CW\*(C`BEGIN\*(C'\fR block as an XS subroutine with a prototype no longer
+crashes because of the early freeing of the subroutine.
+.IP \(bu 4
+The \f(CW\*(C`printf\*(C'\fR format specifier \f(CW\*(C`%.0f\*(C'\fR no longer rounds incorrectly
+[GH #9125] <https://github.com/Perl/perl5/issues/9125>,
+and now shows the correct sign for a negative zero.
+.IP \(bu 4
+Fixed an issue where the error \f(CW\*(C`Scalar value @arrayname[0] better
+written as $arrayname\*(C'\fR would give an error \f(CW\*(C`Cannot printf Inf with \*(Aqc\*(Aq\*(C'\fR
+when arrayname starts with \f(CW\*(C`Inf\*(C'\fR.
+[GH #16335] <https://github.com/Perl/perl5/issues/16335>
+.IP \(bu 4
+The Perl implementation of \f(CWgetcwd()\fR in \f(CW\*(C`Cwd\*(C'\fR in the PathTools
+distribution now behaves the same as XS implementation on errors: it
+returns an error, and sets \f(CW$!\fR.
+[GH #16338] <https://github.com/Perl/perl5/issues/16338>
+.IP \(bu 4
+Vivify array elements when putting them on the stack.
+Fixes [GH #5310] <https://github.com/Perl/perl5/issues/5310>
+(reported in April 2002).
+.IP \(bu 4
+Fixed parsing of braced subscript after parens. Fixes
+[GH #4688] <https://github.com/Perl/perl5/issues/4688>
+(reported in December 2001).
+.IP \(bu 4
+\&\f(CW\*(C`tr/non_utf8/long_non_utf8/c\*(C'\fR could give the wrong results when the
+length of the replacement character list was greater than 0x7fff.
+.IP \(bu 4
+\&\f(CW\*(C`tr/non_utf8/non_utf8/cd\*(C'\fR failed to add the implied
+\&\f(CW\*(C`\ex{100}\-\ex{7fffffff}\*(C'\fR to the search character list.
+.IP \(bu 4
+Compilation failures within "perl-within-perl" constructs, such as with
+string interpolation and the right part of \f(CW\*(C`s///e\*(C'\fR, now cause
+compilation to abort earlier.
+.Sp
+Previously compilation could continue in order to report other errors,
+but the failed sub-parse could leave partly parsed constructs on the
+parser shift-reduce stack, confusing the parser, leading to perl
+crashes.
+[GH #14739] <https://github.com/Perl/perl5/issues/14739>
+.IP \(bu 4
+On threaded perls where the decimal point (radix) character is not a
+dot, it has been possible for a race to occur between threads when one
+needs to use the real radix character (such as with \f(CW\*(C`sprintf\*(C'\fR). This has
+now been fixed by use of a mutex on systems without thread-safe locales,
+and the problem just doesn't come up on those with thread-safe locales.
+.IP \(bu 4
+Errors while compiling a regex character class could sometime trigger an
+assertion failure.
+[GH #16172] <https://github.com/Perl/perl5/issues/16172>
+.SH Acknowledgements
+.IX Header "Acknowledgements"
+Perl 5.28.0 represents approximately 13 months of development since Perl
+5.26.0 and contains approximately 730,000 lines of changes across 2,200
+files from 77 authors.
+.PP
+Excluding auto-generated files, documentation and release tools, there were
+approximately 580,000 lines of changes to 1,300 .pm, .t, .c and .h files.
+.PP
+Perl continues to flourish into its fourth decade thanks to a vibrant
+community of users and developers. The following people are known to have
+contributed the improvements that became Perl 5.28.0:
+.PP
+Aaron Crane, Abigail, Ævar Arnfjörð Bjarmason, Alberto Simões, Alexandr
+Savca, Andrew Fresh, Andy Dougherty, Andy Lester, Aristotle Pagaltzis, Ask
+Bjørn Hansen, Chris 'BinGOs' Williams, Craig A. Berry, Dagfinn Ilmari
+Mannsåker, Dan Collins, Daniel Dragan, David Cantrell, David Mitchell,
+Dmitry Ulanov, Dominic Hargreaves, E. Choroba, Eric Herman, Eugen Konkov,
+Father Chrysostomos, Gene Sullivan, George Hartzell, Graham Knop, Harald
+Jörg, H.Merijn Brand, Hugo van der Sanden, Jacques Germishuys, James E
+Keenan, Jarkko Hietaniemi, Jerry D. Hedden, J. Nick Koston, John Lightsey,
+John Peacock, John P. Linderman, John SJ Anderson, Karen Etheridge, Karl
+Williamson, Ken Brown, Ken Cotterill, Leon Timmermans, Lukas Mai, Marco
+Fontani, Marc-Philip Werner, Matthew Horsfall, Neil Bowers, Nicholas Clark,
+Nicolas R., Niko Tyni, Pali, Paul Marquess, Peter John Acklam, Reini Urban,
+Renee Baecker, Ricardo Signes, Robin Barker, Sawyer X, Scott Lanning, Sergey
+Aleynikov, Shirakata Kentaro, Shoichi Kaji, Slaven Rezic, Smylers, Steffen
+Müller, Steve Hay, Sullivan Beck, Thomas Sibley, Todd Rinaldo, Tomasz
+Konojacki, Tom Hukins, Tom Wyant, Tony Cook, Vitali Peil, Yves Orton,
+Zefram.
+.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 perl bug database
+at <https://rt.perl.org/> . 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 see
+"SECURITY VULNERABILITY CONTACT INFORMATION" in perlsec
+for details of how to report the issue.
+.SH "Give Thanks"
+.IX Header "Give Thanks"
+If you wish to thank the Perl 5 Porters for the work we had done in Perl 5,
+you can do so by running the \f(CW\*(C`perlthanks\*(C'\fR program:
+.PP
+.Vb 1
+\& perlthanks
+.Ve
+.PP
+This will send an email to the Perl 5 Porters list with your show of thanks.
+.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.