diff options
Diffstat (limited to 'upstream/mageia-cauldron/man1/perl5260delta.1')
-rw-r--r-- | upstream/mageia-cauldron/man1/perl5260delta.1 | 2481 |
1 files changed, 2481 insertions, 0 deletions
diff --git a/upstream/mageia-cauldron/man1/perl5260delta.1 b/upstream/mageia-cauldron/man1/perl5260delta.1 new file mode 100644 index 00000000..39769e74 --- /dev/null +++ b/upstream/mageia-cauldron/man1/perl5260delta.1 @@ -0,0 +1,2481 @@ +.\" -*- 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 "PERL5260DELTA 1" +.TH PERL5260DELTA 1 2023-11-28 "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 +perl5260delta \- what is new for perl v5.26.0 +.SH DESCRIPTION +.IX Header "DESCRIPTION" +This document describes the differences between the 5.24.0 release and the +5.26.0 release. +.SH Notice +.IX Header "Notice" +This release includes three updates with widespread effects: +.IP \(bu 4 +\&\f(CW"."\fR no longer in \f(CW@INC\fR +.Sp +For security reasons, the current directory (\f(CW"."\fR) is no longer included +by default at the end of the module search path (\f(CW@INC\fR). This may have +widespread implications for the building, testing and installing of +modules, and for the execution of scripts. See the section +"Removal of the current directory (\f(CW"."\fR) from \f(CW@INC\fR" +for the full details. +.IP \(bu 4 +\&\f(CW\*(C`do\*(C'\fR may now warn +.Sp +\&\f(CW\*(C`do\*(C'\fR now gives a deprecation warning when it fails to load a file which +it would have loaded had \f(CW"."\fR been in \f(CW@INC\fR. +.IP \(bu 4 +In regular expression patterns, a literal left brace \f(CW"{"\fR +should be escaped +.Sp +See "Unescaped literal \f(CW"{"\fR characters in regular expression patterns are no longer permissible". +.SH "Core Enhancements" +.IX Header "Core Enhancements" +.SS "Lexical subroutines are no longer experimental" +.IX Subsection "Lexical subroutines are no longer experimental" +Using the \f(CW\*(C`lexical_subs\*(C'\fR feature introduced in v5.18 no longer emits a warning. Existing +code that disables the \f(CW\*(C`experimental::lexical_subs\*(C'\fR warning category +that the feature previously used will continue to work. The +\&\f(CW\*(C`lexical_subs\*(C'\fR feature has no effect; all Perl code can use lexical +subroutines, regardless of what feature declarations are in scope. +.SS "Indented Here-documents" +.IX Subsection "Indented Here-documents" +This adds a new modifier \f(CW"~"\fR to here-docs that tells the parser +that it should look for \f(CW\*(C`/^\es*$DELIM\en/\*(C'\fR as the closing delimiter. +.PP +These syntaxes are all supported: +.PP +.Vb 8 +\& <<~EOF; +\& <<~\eEOF; +\& <<~\*(AqEOF\*(Aq; +\& <<~"EOF"; +\& <<~\`EOF\`; +\& <<~ \*(AqEOF\*(Aq; +\& <<~ "EOF"; +\& <<~ \`EOF\`; +.Ve +.PP +The \f(CW"~"\fR modifier will strip, from each line in the here-doc, the +same whitespace that appears before the delimiter. +.PP +Newlines will be copied as-is, and lines that don't include the +proper beginning whitespace will cause perl to croak. +.PP +For example: +.PP +.Vb 5 +\& if (1) { +\& print <<~EOF; +\& Hello there +\& EOF +\& } +.Ve +.PP +prints "Hello there\en" with no leading whitespace. +.ie n .SS "New regular expression modifier ""/xx""" +.el .SS "New regular expression modifier \f(CW/xx\fP" +.IX Subsection "New regular expression modifier /xx" +Specifying two \f(CW"x"\fR characters to modify a regular expression pattern +does everything that a single one does, but additionally TAB and SPACE +characters within a bracketed character class are generally ignored and +can be added to improve readability, like +\&\f(CW\*(C`/[\ ^\ A\-Z\ d\-f\ p\-x\ ]/xx\*(C'\fR. Details are at +"/x and /xx" in perlre. +.ie n .SS """@{^CAPTURE}"", ""%{^CAPTURE}"", and ""%{^CAPTURE_ALL}""" +.el .SS "\f(CW@{^CAPTURE}\fP, \f(CW%{^CAPTURE}\fP, and \f(CW%{^CAPTURE_ALL}\fP" +.IX Subsection "@{^CAPTURE}, %{^CAPTURE}, and %{^CAPTURE_ALL}" +\&\f(CW\*(C`@{^CAPTURE}\*(C'\fR exposes the capture buffers of the last match as an +array. So \f(CW$1\fR is \f(CW\*(C`${^CAPTURE}[0]\*(C'\fR. This is a more efficient equivalent +to code like \f(CW\*(C`substr($matched_string,$\-[0],$+[0]\-$\-[0])\*(C'\fR, and you don't +have to keep track of the \f(CW$matched_string\fR either. This variable has no +single character equivalent. Note that, like the other regex magic variables, +the contents of this variable is dynamic; if you wish to store it beyond +the lifetime of the match you must copy it to another array. +.PP +\&\f(CW\*(C`%{^CAPTURE}\*(C'\fR is equivalent to \f(CW\*(C`%+\*(C'\fR (\fIi.e.\fR, named captures). Other than +being more self-documenting there is no difference between the two forms. +.PP +\&\f(CW\*(C`%{^CAPTURE_ALL}\*(C'\fR is equivalent to \f(CW\*(C`%\-\*(C'\fR (\fIi.e.\fR, all named captures). +Other than being more self-documenting there is no difference between the +two forms. +.SS "Declaring a reference to a variable" +.IX Subsection "Declaring a reference to a variable" +As an experimental feature, Perl now allows the referencing operator to come +after \f(CWmy()\fR, \f(CWstate()\fR, +\&\f(CWour()\fR, or \f(CWlocal()\fR. This syntax must +be enabled with \f(CW\*(C`use feature \*(Aqdeclared_refs\*(Aq\*(C'\fR. It is experimental, and will +warn by default unless \f(CW\*(C`no warnings \*(Aqexperimental::refaliasing\*(Aq\*(C'\fR is in effect. +It is intended mainly for use in assignments to references. For example: +.PP +.Vb 2 +\& use experimental \*(Aqrefaliasing\*(Aq, \*(Aqdeclared_refs\*(Aq; +\& my \e$a = \e$b; +.Ve +.PP +See "Assigning to References" in perlref for more details. +.SS "Unicode 9.0 is now supported" +.IX Subsection "Unicode 9.0 is now supported" +A list of changes is at <http://www.unicode.org/versions/Unicode9.0.0/>. +Modules that are shipped with core Perl but not maintained by p5p do not +necessarily support Unicode 9.0. Unicode::Normalize does work on 9.0. +.ie n .SS "Use of ""\ep{\fIscript\fP}"" uses the improved Script_Extensions property" +.el .SS "Use of \f(CW\ep{\fP\f(CIscript\fP\f(CW}\fP uses the improved Script_Extensions property" +.IX Subsection "Use of p{script} uses the improved Script_Extensions property" +Unicode 6.0 introduced an improved form of the Script (\f(CW\*(C`sc\*(C'\fR) property, and +called it Script_Extensions (\f(CW\*(C`scx\*(C'\fR). Perl now uses this improved +version when a property is specified as just \f(CW\*(C`\ep{\fR\f(CIscript\fR\f(CW}\*(C'\fR. This +should make programs more accurate when determining if a character is +used in a given script, but there is a slight chance of breakage for +programs that very specifically needed the old behavior. The meaning of +compound forms, like \f(CW\*(C`\ep{sc=\fR\f(CIscript\fR\f(CW}\*(C'\fR are unchanged. See +"Scripts" in perlunicode. +.SS "Perl can now do default collation in UTF\-8 locales on platforms that support it" +.IX Subsection "Perl can now do default collation in UTF-8 locales on platforms that support it" +Some platforms natively do a reasonable job of collating and sorting in +UTF\-8 locales. Perl now works with those. For portability and full +control, Unicode::Collate is still recommended, but now you may +not need to do anything special to get good-enough results, depending on +your application. See +"Category \f(CW\*(C`LC_COLLATE\*(C'\fR: Collation: Text Comparisons and Sorting" in perllocale. +.ie n .SS "Better locale collation of strings containing embedded ""NUL"" characters" +.el .SS "Better locale collation of strings containing embedded \f(CWNUL\fP characters" +.IX Subsection "Better locale collation of strings containing embedded NUL characters" +In locales that have multi-level character weights, \f(CW\*(C`NUL\*(C'\fRs are now +ignored at the higher priority ones. There are still some gotchas in +some strings, though. See +"Collation of strings containing embedded \f(CW\*(C`NUL\*(C'\fR characters" in perllocale. +.ie n .SS """CORE"" subroutines for hash and array functions callable via reference" +.el .SS "\f(CWCORE\fP subroutines for hash and array functions callable via reference" +.IX Subsection "CORE subroutines for hash and array functions callable via reference" +The hash and array functions in the \f(CW\*(C`CORE\*(C'\fR namespace (\f(CW\*(C`keys\*(C'\fR, \f(CW\*(C`each\*(C'\fR, +\&\f(CW\*(C`values\*(C'\fR, \f(CW\*(C`push\*(C'\fR, \f(CW\*(C`pop\*(C'\fR, \f(CW\*(C`shift\*(C'\fR, \f(CW\*(C`unshift\*(C'\fR and \f(CW\*(C`splice\*(C'\fR) can now +be called with ampersand syntax (\f(CW\*(C`&CORE::keys(\e%hash\*(C'\fR) and via reference +(\f(CW\*(C`my $k = \e&CORE::keys; $k\->(\e%hash)\*(C'\fR). Previously they could only be +used when inlined. +.SS "New Hash Function For 64\-bit Builds" +.IX Subsection "New Hash Function For 64-bit Builds" +We have switched to a hybrid hash function to better balance +performance for short and long keys. +.PP +For short keys, 16 bytes and under, we use an optimised variant of +One At A Time Hard, and for longer keys we use Siphash 1\-3. For very +long keys this is a big improvement in performance. For shorter keys +there is a modest improvement. +.SH Security +.IX Header "Security" +.ie n .SS "Removal of the current directory (""."") from @INC" +.el .SS "Removal of the current directory (\f(CW"".""\fP) from \f(CW@INC\fP" +.IX Subsection "Removal of the current directory (""."") from @INC" +The perl binary includes a default set of paths in \f(CW@INC\fR. Historically +it has also included the current directory (\f(CW"."\fR) as the final entry, +unless run with taint mode enabled (\f(CW\*(C`perl \-T\*(C'\fR). While convenient, this has +security implications: for example, where a script attempts to load an +optional module when its current directory is untrusted (such as \fI/tmp\fR), +it could load and execute code from under that directory. +.PP +Starting with v5.26, \f(CW"."\fR is always removed by default, not just under +tainting. This has major implications for installing modules and executing +scripts. +.PP +The following new features have been added to help ameliorate these +issues. +.IP \(bu 4 +\&\fIConfigure \-Udefault_inc_excludes_dot\fR +.Sp +There is a new \fIConfigure\fR option, \f(CW\*(C`default_inc_excludes_dot\*(C'\fR (enabled +by default) which builds a perl executable without \f(CW"."\fR; unsetting this +option using \f(CW\*(C`\-U\*(C'\fR reverts perl to the old behaviour. This may fix your +path issues but will reintroduce all the security concerns, so don't +build a perl executable like this unless you're \fIreally\fR confident that +such issues are not a concern in your environment. +.IP \(bu 4 +\&\f(CW\*(C`PERL_USE_UNSAFE_INC\*(C'\fR +.Sp +There is a new environment variable recognised by the perl interpreter. +If this variable has the value 1 when the perl interpreter starts up, +then \f(CW"."\fR will be automatically appended to \f(CW@INC\fR (except under tainting). +.Sp +This allows you restore the old perl interpreter behaviour on a +case-by-case basis. But note that this is intended to be a temporary crutch, +and this feature will likely be removed in some future perl version. +It is currently set by the \f(CW\*(C`cpan\*(C'\fR utility and \f(CW\*(C`Test::Harness\*(C'\fR to +ease installation of CPAN modules which have not been updated to handle the +lack of dot. Once again, don't use this unless you are sure that this +will not reintroduce any security concerns. +.IP \(bu 4 +A new deprecation warning issued by \f(CW\*(C`do\*(C'\fR. +.Sp +While it is well-known that \f(CW\*(C`use\*(C'\fR and \f(CW\*(C`require\*(C'\fR use \f(CW@INC\fR to search +for the file to load, many people don't realise that \f(CW\*(C`do "file"\*(C'\fR also +searches \f(CW@INC\fR if the file is a relative path. With the removal of \f(CW"."\fR, +a simple \f(CW\*(C`do "file.pl"\*(C'\fR will fail to read in and execute \f(CW\*(C`file.pl\*(C'\fR from +the current directory. Since this is commonly expected behaviour, a new +deprecation warning is now issued whenever \f(CW\*(C`do\*(C'\fR fails to load a file which +it otherwise would have found if a dot had been in \f(CW@INC\fR. +.PP +Here are some things script and module authors may need to do to make +their software work in the new regime. +.IP \(bu 4 +Script authors +.Sp +If the issue is within your own code (rather than within included +modules), then you have two main options. Firstly, if you are confident +that your script will only be run within a trusted directory (under which +you expect to find trusted files and modules), then add \f(CW"."\fR back into the +path; \fIe.g.\fR: +.Sp +.Vb 6 +\& BEGIN { +\& my $dir = "/some/trusted/directory"; +\& chdir $dir or die "Can\*(Aqt chdir to $dir: $!\en"; +\& # safe now +\& push @INC, \*(Aq.\*(Aq; +\& } +\& +\& use "Foo::Bar"; # may load /some/trusted/directory/Foo/Bar.pm +\& do "config.pl"; # may load /some/trusted/directory/config.pl +.Ve +.Sp +On the other hand, if your script is intended to be run from within +untrusted directories (such as \fI/tmp\fR), then your script suddenly failing +to load files may be indicative of a security issue. You most likely want +to replace any relative paths with full paths; for example, +.Sp +.Vb 1 +\& do "foo_config.pl" +.Ve +.Sp +might become +.Sp +.Vb 1 +\& do "$ENV{HOME}/foo_config.pl" +.Ve +.Sp +If you are absolutely certain that you want your script to load and +execute a file from the current directory, then use a \f(CW\*(C`./\*(C'\fR prefix; for +example: +.Sp +.Vb 1 +\& do "./foo_config.pl" +.Ve +.IP \(bu 4 +Installing and using CPAN modules +.Sp +If you install a CPAN module using an automatic tool like \f(CW\*(C`cpan\*(C'\fR, then +this tool will itself set the \f(CW\*(C`PERL_USE_UNSAFE_INC\*(C'\fR environment variable +while building and testing the module, which may be sufficient to install +a distribution which hasn't been updated to be dot-aware. If you want to +install such a module manually, then you'll need to replace the +traditional invocation: +.Sp +.Vb 1 +\& perl Makefile.PL && make && make test && make install +.Ve +.Sp +with something like +.Sp +.Vb 2 +\& (export PERL_USE_UNSAFE_INC=1; \e +\& perl Makefile.PL && make && make test && make install) +.Ve +.Sp +Note that this only helps build and install an unfixed module. It's +possible for the tests to pass (since they were run under +\&\f(CW\*(C`PERL_USE_UNSAFE_INC=1\*(C'\fR), but for the module itself to fail to perform +correctly in production. In this case, you may have to temporarily modify +your script until a fixed version of the module is released. +For example: +.Sp +.Vb 6 +\& use Foo::Bar; +\& { +\& local @INC = (@INC, \*(Aq.\*(Aq); +\& # assuming read_config() needs \*(Aq.\*(Aq in @INC +\& $config = Foo::Bar\->read_config(); +\& } +.Ve +.Sp +This is only rarely expected to be necessary. Again, if doing this, +assess the resultant risks first. +.IP \(bu 4 +Module Authors +.Sp +If you maintain a CPAN distribution, it may need updating to run in +a dotless environment. Although \f(CW\*(C`cpan\*(C'\fR and other such tools will +currently set the \f(CW\*(C`PERL_USE_UNSAFE_INC\*(C'\fR during module build, this is a +temporary workaround for the set of modules which rely on \f(CW"."\fR being in +\&\f(CW@INC\fR for installation and testing, and this may mask deeper issues. It +could result in a module which passes tests and installs, but which +fails at run time. +.Sp +During build, test, and install, it will normally be the case that any perl +processes will be executing directly within the root directory of the +untarred distribution, or a known subdirectory of that, such as \fIt/\fR. It +may well be that \fIMakefile.PL\fR or \fIt/foo.t\fR will attempt to include +local modules and configuration files using their direct relative +filenames, which will now fail. +.Sp +However, as described above, automatic tools like \fIcpan\fR will (for now) +set the \f(CW\*(C`PERL_USE_UNSAFE_INC\*(C'\fR environment variable, which introduces +dot during a build. +.Sp +This makes it likely that your existing build and test code will work, but +this may mask issues with your code which only manifest when used after +install. It is prudent to try and run your build process with that +variable explicitly disabled: +.Sp +.Vb 2 +\& (export PERL_USE_UNSAFE_INC=0; \e +\& perl Makefile.PL && make && make test && make install) +.Ve +.Sp +This is more likely to show up any potential problems with your module's +build process, or even with the module itself. Fixing such issues will +ensure both that your module can again be installed manually, and that +it will still build once the \f(CW\*(C`PERL_USE_UNSAFE_INC\*(C'\fR crutch goes away. +.Sp +When fixing issues in tests due to the removal of dot from \f(CW@INC\fR, +reinsertion of dot into \f(CW@INC\fR should be performed with caution, for this +too may suppress real errors in your runtime code. You are encouraged +wherever possible to apply the aforementioned approaches with explicit +absolute/relative paths, or to relocate your needed files into a +subdirectory and insert that subdirectory into \f(CW@INC\fR instead. +.Sp +If your runtime code has problems under the dotless \f(CW@INC\fR, then the comments +above on how to fix for script authors will mostly apply here too. Bear in +mind though that it is considered bad form for a module to globally add a dot to +\&\f(CW@INC\fR, since it introduces both a security risk and hides issues of +accidentally requiring dot in \f(CW@INC\fR, as explained above. +.SS "Escaped colons and relative paths in PATH" +.IX Subsection "Escaped colons and relative paths in PATH" +On Unix systems, Perl treats any relative paths in the \f(CW\*(C`PATH\*(C'\fR environment +variable as tainted when starting a new process. Previously, it was +allowing a backslash to escape a colon (unlike the OS), consequently +allowing relative paths to be considered safe if the PATH was set to +something like \f(CW\*(C`/\e:.\*(C'\fR. The check has been fixed to treat \f(CW"."\fR as tainted +in that example. +.ie n .SS "New ""\-Di"" switch is now required for PerlIO debugging output" +.el .SS "New \f(CW\-Di\fP switch is now required for PerlIO debugging output" +.IX Subsection "New -Di switch is now required for PerlIO debugging output" +This is used for debugging of code within PerlIO to avoid recursive +calls. Previously this output would be sent to the file specified +by the \f(CW\*(C`PERLIO_DEBUG\*(C'\fR environment variable if perl wasn't running +setuid and the \f(CW\*(C`\-T\*(C'\fR or \f(CW\*(C`\-t\*(C'\fR switches hadn't been parsed yet. +.PP +If perl performed output at a point where it hadn't yet parsed its +switches this could result in perl creating or overwriting the file +named by \f(CW\*(C`PERLIO_DEBUG\*(C'\fR even when the \f(CW\*(C`\-T\*(C'\fR switch had been supplied. +.PP +Perl now requires the \f(CW\*(C`\-Di\*(C'\fR switch to be present before it will produce +PerlIO debugging +output. By default this is written to \f(CW\*(C`stderr\*(C'\fR, but can optionally +be redirected to a file by setting the \f(CW\*(C`PERLIO_DEBUG\*(C'\fR environment +variable. +.PP +If perl is running setuid or the \f(CW\*(C`\-T\*(C'\fR switch was supplied, +\&\f(CW\*(C`PERLIO_DEBUG\*(C'\fR is ignored and the debugging output is sent to +\&\f(CW\*(C`stderr\*(C'\fR as for any other \f(CW\*(C`\-D\*(C'\fR switch. +.SH "Incompatible Changes" +.IX Header "Incompatible Changes" +.ie n .SS "Unescaped literal ""{"" characters in regular expression patterns are no longer permissible" +.el .SS "Unescaped literal \f(CW""{""\fP characters in regular expression patterns are no longer permissible" +.IX Subsection "Unescaped literal ""{"" characters in regular expression patterns are no longer permissible" +You have to now say something like \f(CW"\e{"\fR or \f(CW"[{]"\fR to specify to +match a LEFT CURLY BRACKET; otherwise, it is a fatal pattern compilation +error. This change will allow future extensions to the language. +.PP +These have been deprecated since v5.16, with a deprecation message +raised for some uses starting in v5.22. Unfortunately, the code added +to raise the message was buggy and failed to warn in some cases where +it should have. Therefore, enforcement of this ban for these cases is +deferred until Perl 5.30, but the code has been fixed to raise a +default-on deprecation message for them in the meantime. +.PP +Some uses of literal \f(CW"{"\fR occur in contexts where we do not foresee +the meaning ever being anything but the literal, such as the very first +character in the pattern, or after a \f(CW"|"\fR meaning alternation. Thus +.PP +.Vb 1 +\& qr/{fee|{fie/ +.Ve +.PP +matches either of the strings \f(CW\*(C`{fee\*(C'\fR or \f(CW\*(C`{fie\*(C'\fR. To avoid forcing +unnecessary code changes, these uses do not need to be escaped, and no +warning is raised about them, and there are no current plans to change this. +.PP +But it is always correct to escape \f(CW"{"\fR, and the simple rule to +remember is to always do so. +.PP +See Unescaped left brace in regex is illegal here. +.ie n .SS "scalar(%hash) return signature changed" +.el .SS "\f(CWscalar(%hash)\fP return signature changed" +.IX Subsection "scalar(%hash) return signature changed" +The value returned for \f(CWscalar(%hash)\fR will no longer show information about +the buckets allocated in the hash. It will simply return the count of used +keys. It is thus equivalent to \f(CW\*(C`0+keys(%hash)\*(C'\fR. +.PP +A form of backward compatibility is provided via +\&\f(CWHash::Util::bucket_ratio()\fR which provides +the same behavior as +\&\f(CWscalar(%hash)\fR provided in Perl 5.24 and earlier. +.ie n .SS """keys"" returned from an lvalue subroutine" +.el .SS "\f(CWkeys\fP returned from an lvalue subroutine" +.IX Subsection "keys returned from an lvalue subroutine" +\&\f(CW\*(C`keys\*(C'\fR returned from an lvalue subroutine can no longer be assigned +to in list context. +.PP +.Vb 4 +\& sub foo : lvalue { keys(%INC) } +\& (foo) = 3; # death +\& sub bar : lvalue { keys(@_) } +\& (bar) = 3; # also an error +.Ve +.PP +This makes the lvalue sub case consistent with \f(CW\*(C`(keys %hash) = ...\*(C'\fR and +\&\f(CW\*(C`(keys @_) = ...\*(C'\fR, which are also errors. +[GH #15339] <https://github.com/Perl/perl5/issues/15339> +.ie n .SS "The ""${^ENCODING}"" facility has been removed" +.el .SS "The \f(CW${^ENCODING}\fP facility has been removed" +.IX Subsection "The ${^ENCODING} facility has been removed" +The special behaviour associated with assigning a value to this variable +has been removed. As a consequence, the encoding pragma's default mode +is no longer supported. If +you still need to write your source code in encodings other than UTF\-8, use a +source filter such as Filter::Encoding on CPAN or encoding's \f(CW\*(C`Filter\*(C'\fR +option. +.ie n .SS "POSIX::tmpnam() has been removed" +.el .SS "\f(CWPOSIX::tmpnam()\fP has been removed" +.IX Subsection "POSIX::tmpnam() has been removed" +The fundamentally unsafe \f(CWtmpnam()\fR interface was deprecated in +Perl 5.22 and has now been removed. In its place, you can use, +for example, the File::Temp interfaces. +.SS "require ::Foo::Bar is now illegal." +.IX Subsection "require ::Foo::Bar is now illegal." +Formerly, \f(CW\*(C`require ::Foo::Bar\*(C'\fR would try to read \fI/Foo/Bar.pm\fR. Now any +bareword require which starts with a double colon dies instead. +.SS "Literal control character variable names are no longer permissible" +.IX Subsection "Literal control character variable names are no longer permissible" +A variable name may no longer contain a literal control character under +any circumstances. These previously were allowed in single-character +names on ASCII platforms, but have been deprecated there since Perl +5.20. This affects things like \f(CW\*(C`$\fR\f(CI\ecT\fR\f(CW\*(C'\fR, where \fI\ecT\fR 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. +.ie n .SS """NBSP"" is no longer permissible in ""\eN{...}""" +.el .SS "\f(CWNBSP\fP is no longer permissible in \f(CW\eN{...}\fP" +.IX Subsection "NBSP is no longer permissible in N{...}" +The name of a character may no longer contain non-breaking spaces. It +has been deprecated to do so since Perl 5.22. +.SH Deprecations +.IX Header "Deprecations" +.SS "String delimiters that aren't stand-alone graphemes are now deprecated" +.IX Subsection "String delimiters that aren't stand-alone graphemes are now deprecated" +For Perl to eventually allow string delimiters to be Unicode +grapheme clusters (which look like a single character, but may be +a sequence of several ones), we have to stop allowing a single character +delimiter that isn't a grapheme by itself. These are unlikely to exist +in actual code, as they would typically display as attached to the +character in front of them. +.ie n .SS """\ec\fIX\fP"" that maps to a printable is no longer deprecated" +.el .SS "\f(CW\ec\fP\f(CIX\fP\f(CW\fP that maps to a printable is no longer deprecated" +.IX Subsection "cX that maps to a printable is no longer deprecated" +This means we have no plans to remove this feature. It still raises a +warning, but only if syntax warnings are enabled. The feature was +originally intended to be a way to express non-printable characters that +don't have a mnemonic (\f(CW\*(C`\et\*(C'\fR and \f(CW\*(C`\en\*(C'\fR are mnemonics for two +non-printable characters, but most non-printables don't have a +mnemonic.) But the feature can be used to specify a few printable +characters, though those are more clearly expressed as the printable +itself. See +<http://www.nntp.perl.org/group/perl.perl5.porters/2017/02/msg242944.html>. +.SH "Performance Enhancements" +.IX Header "Performance Enhancements" +.IP \(bu 4 +A hash in boolean context is now sometimes faster, \fIe.g.\fR +.Sp +.Vb 1 +\& if (!%h) { ... } +.Ve +.Sp +This was already special-cased, but some cases were missed (such as +\&\f(CW\*(C`grep %$_, @AoH\*(C'\fR), and even the ones which weren't have been improved. +.IP \(bu 4 +New Faster Hash Function on 64 bit builds +.Sp +We use a different hash function for short and long keys. This should +improve performance and security, especially for long keys. +.IP \(bu 4 +readline is faster +.Sp +Reading from a file line-by-line with \f(CWreadline()\fR or \f(CW\*(C`<>\*(C'\fR should +now typically be faster due to a better implementation of the code that +searches for the next newline character. +.IP \(bu 4 +Assigning one reference to another, \fIe.g.\fR \f(CW\*(C`$ref1 = $ref2\*(C'\fR has been +optimized in some cases. +.IP \(bu 4 +Remove some exceptions to creating Copy-on-Write strings. The string +buffer growth algorithm has been slightly altered so that you're less +likely to encounter a string which can't be COWed. +.IP \(bu 4 +Better optimise array and hash assignment: where an array or hash appears +in the LHS of a list assignment, such as \f(CW\*(C`(..., @a) = (...);\*(C'\fR, it's +likely to be considerably faster, especially if it involves emptying the +array/hash. For example, this code runs about a third faster compared to +Perl 5.24.0: +.Sp +.Vb 5 +\& my @a; +\& for my $i (1..10_000_000) { +\& @a = (1,2,3); +\& @a = (); +\& } +.Ve +.IP \(bu 4 +Converting a single-digit string to a number is now substantially faster. +.IP \(bu 4 +The \f(CW\*(C`split\*(C'\fR builtin is now slightly faster in many cases: in particular +for the two specially-handled forms +.Sp +.Vb 2 +\& my @a = split ...; +\& local @a = split ...; +.Ve +.IP \(bu 4 +The rather slow implementation for the experimental subroutine signatures +feature has been made much faster; it is now comparable in speed with the +traditional \f(CW\*(C`my ($a, $b, @c) = @_\*(C'\fR. +.IP \(bu 4 +Bareword constant strings are now permitted to take part in constant +folding. They were originally exempted from constant folding in August 1999, +during the development of Perl 5.6, to ensure that \f(CW\*(C`use strict "subs"\*(C'\fR +would still apply to bareword constants. That has now been accomplished a +different way, so barewords, like other constants, now gain the performance +benefits of constant folding. +.Sp +This also means that void-context warnings on constant expressions of +barewords now report the folded constant operand, rather than the operation; +this matches the behaviour for non-bareword constants. +.SH "Modules and Pragmata" +.IX Header "Modules and Pragmata" +.SS "Updated Modules and Pragmata" +.IX Subsection "Updated Modules and Pragmata" +.IP \(bu 4 +IO::Compress has been upgraded from version 2.069 to 2.074. +.IP \(bu 4 +Archive::Tar has been upgraded from version 2.04 to 2.24. +.IP \(bu 4 +arybase has been upgraded from version 0.11 to 0.12. +.IP \(bu 4 +attributes has been upgraded from version 0.27 to 0.29. +.Sp +The deprecation message for the \f(CW\*(C`:unique\*(C'\fR and \f(CW\*(C`:locked\*(C'\fR attributes +now mention that they will disappear in Perl 5.28. +.IP \(bu 4 +B has been upgraded from version 1.62 to 1.68. +.IP \(bu 4 +B::Concise has been upgraded from version 0.996 to 0.999. +.Sp +Its output is now more descriptive for \f(CW\*(C`op_private\*(C'\fR flags. +.IP \(bu 4 +B::Debug has been upgraded from version 1.23 to 1.24. +.IP \(bu 4 +B::Deparse has been upgraded from version 1.37 to 1.40. +.IP \(bu 4 +B::Xref has been upgraded from version 1.05 to 1.06. +.Sp +It now uses 3\-arg \f(CWopen()\fR instead of 2\-arg \f(CWopen()\fR. +[GH #15721] <https://github.com/Perl/perl5/issues/15721> +.IP \(bu 4 +base has been upgraded from version 2.23 to 2.25. +.IP \(bu 4 +bignum has been upgraded from version 0.42 to 0.47. +.IP \(bu 4 +Carp has been upgraded from version 1.40 to 1.42. +.IP \(bu 4 +charnames has been upgraded from version 1.43 to 1.44. +.IP \(bu 4 +Compress::Raw::Bzip2 has been upgraded from version 2.069 to 2.074. +.IP \(bu 4 +Compress::Raw::Zlib has been upgraded from version 2.069 to 2.074. +.IP \(bu 4 +Config::Perl::V has been upgraded from version 0.25 to 0.28. +.IP \(bu 4 +CPAN has been upgraded from version 2.11 to 2.18. +.IP \(bu 4 +CPAN::Meta has been upgraded from version 2.150005 to 2.150010. +.IP \(bu 4 +Data::Dumper has been upgraded from version 2.160 to 2.167. +.Sp +The XS implementation now supports Deparse. +.IP \(bu 4 +DB_File has been upgraded from version 1.835 to 1.840. +.IP \(bu 4 +Devel::Peek has been upgraded from version 1.23 to 1.26. +.IP \(bu 4 +Devel::PPPort has been upgraded from version 3.32 to 3.35. +.IP \(bu 4 +Devel::SelfStubber has been upgraded from version 1.05 to 1.06. +.Sp +It now uses 3\-arg \f(CWopen()\fR instead of 2\-arg \f(CWopen()\fR. +[GH #15721] <https://github.com/Perl/perl5/issues/15721> +.IP \(bu 4 +diagnostics has been upgraded from version 1.34 to 1.36. +.Sp +It now uses 3\-arg \f(CWopen()\fR instead of 2\-arg \f(CWopen()\fR. +[GH #15721] <https://github.com/Perl/perl5/issues/15721> +.IP \(bu 4 +Digest has been upgraded from version 1.17 to 1.17_01. +.IP \(bu 4 +Digest::MD5 has been upgraded from version 2.54 to 2.55. +.IP \(bu 4 +Digest::SHA has been upgraded from version 5.95 to 5.96. +.IP \(bu 4 +DynaLoader has been upgraded from version 1.38 to 1.42. +.IP \(bu 4 +Encode has been upgraded from version 2.80 to 2.88. +.IP \(bu 4 +encoding has been upgraded from version 2.17 to 2.19. +.Sp +This module's default mode is no longer supported. It now +dies when imported, unless the \f(CW\*(C`Filter\*(C'\fR option is being used. +.IP \(bu 4 +encoding::warnings has been upgraded from version 0.12 to 0.13. +.Sp +This module is no longer supported. It emits a warning to +that effect and then does nothing. +.IP \(bu 4 +Errno has been upgraded from version 1.25 to 1.28. +.Sp +It now documents that using \f(CW\*(C`%!\*(C'\fR automatically loads Errno for you. +.Sp +It now uses 3\-arg \f(CWopen()\fR instead of 2\-arg \f(CWopen()\fR. +[GH #15721] <https://github.com/Perl/perl5/issues/15721> +.IP \(bu 4 +ExtUtils::Embed has been upgraded from version 1.33 to 1.34. +.Sp +It now uses 3\-arg \f(CWopen()\fR instead of 2\-arg \f(CWopen()\fR. +[GH #15721] <https://github.com/Perl/perl5/issues/15721> +.IP \(bu 4 +ExtUtils::MakeMaker has been upgraded from version 7.10_01 to 7.24. +.IP \(bu 4 +ExtUtils::Miniperl has been upgraded from version 1.05 to 1.06. +.IP \(bu 4 +ExtUtils::ParseXS has been upgraded from version 3.31 to 3.34. +.IP \(bu 4 +ExtUtils::Typemaps has been upgraded from version 3.31 to 3.34. +.IP \(bu 4 +feature has been upgraded from version 1.42 to 1.47. +.IP \(bu 4 +File::Copy has been upgraded from version 2.31 to 2.32. +.IP \(bu 4 +File::Fetch has been upgraded from version 0.48 to 0.52. +.IP \(bu 4 +File::Glob has been upgraded from version 1.26 to 1.28. +.Sp +It now Issues a deprecation message for \f(CWFile::Glob::glob()\fR. +.IP \(bu 4 +File::Spec has been upgraded from version 3.63 to 3.67. +.IP \(bu 4 +FileHandle has been upgraded from version 2.02 to 2.03. +.IP \(bu 4 +Filter::Simple has been upgraded from version 0.92 to 0.93. +.Sp +It no longer treats \f(CW\*(C`no MyFilter\*(C'\fR immediately following \f(CW\*(C`use MyFilter\*(C'\fR as +end-of-file. +[GH #11853] <https://github.com/Perl/perl5/issues/11853> +.IP \(bu 4 +Getopt::Long has been upgraded from version 2.48 to 2.49. +.IP \(bu 4 +Getopt::Std has been upgraded from version 1.11 to 1.12. +.IP \(bu 4 +Hash::Util has been upgraded from version 0.19 to 0.22. +.IP \(bu 4 +HTTP::Tiny has been upgraded from version 0.056 to 0.070. +.Sp +Internal 599\-series errors now include the redirect history. +.IP \(bu 4 +I18N::LangTags has been upgraded from version 0.40 to 0.42. +.Sp +It now uses 3\-arg \f(CWopen()\fR instead of 2\-arg \f(CWopen()\fR. +[GH #15721] <https://github.com/Perl/perl5/issues/15721> +.IP \(bu 4 +IO has been upgraded from version 1.36 to 1.38. +.IP \(bu 4 +IO::Socket::IP has been upgraded from version 0.37 to 0.38. +.IP \(bu 4 +IPC::Cmd has been upgraded from version 0.92 to 0.96. +.IP \(bu 4 +IPC::SysV has been upgraded from version 2.06_01 to 2.07. +.IP \(bu 4 +JSON::PP has been upgraded from version 2.27300 to 2.27400_02. +.IP \(bu 4 +lib has been upgraded from version 0.63 to 0.64. +.Sp +It now uses 3\-arg \f(CWopen()\fR instead of 2\-arg \f(CWopen()\fR. +[GH #15721] <https://github.com/Perl/perl5/issues/15721> +.IP \(bu 4 +List::Util has been upgraded from version 1.42_02 to 1.46_02. +.IP \(bu 4 +Locale::Codes has been upgraded from version 3.37 to 3.42. +.IP \(bu 4 +Locale::Maketext has been upgraded from version 1.26 to 1.28. +.IP \(bu 4 +Locale::Maketext::Simple has been upgraded from version 0.21 to 0.21_01. +.IP \(bu 4 +Math::BigInt has been upgraded from version 1.999715 to 1.999806. +.IP \(bu 4 +Math::BigInt::FastCalc has been upgraded from version 0.40 to 0.5005. +.IP \(bu 4 +Math::BigRat has been upgraded from version 0.260802 to 0.2611. +.IP \(bu 4 +Math::Complex has been upgraded from version 1.59 to 1.5901. +.IP \(bu 4 +Memoize has been upgraded from version 1.03 to 1.03_01. +.IP \(bu 4 +Module::CoreList has been upgraded from version 5.20170420 to 5.20170530. +.IP \(bu 4 +Module::Load::Conditional has been upgraded from version 0.64 to 0.68. +.IP \(bu 4 +Module::Metadata has been upgraded from version 1.000031 to 1.000033. +.IP \(bu 4 +mro has been upgraded from version 1.18 to 1.20. +.IP \(bu 4 +Net::Ping has been upgraded from version 2.43 to 2.55. +.Sp +IPv6 addresses and \f(CW\*(C`AF_INET6\*(C'\fR sockets are now supported, along with several +other enhancements. +.IP \(bu 4 +NEXT has been upgraded from version 0.65 to 0.67. +.IP \(bu 4 +Opcode has been upgraded from version 1.34 to 1.39. +.IP \(bu 4 +open has been upgraded from version 1.10 to 1.11. +.IP \(bu 4 +OS2::Process has been upgraded from version 1.11 to 1.12. +.Sp +It now uses 3\-arg \f(CWopen()\fR instead of 2\-arg \f(CWopen()\fR. +[GH #15721] <https://github.com/Perl/perl5/issues/15721> +.IP \(bu 4 +overload has been upgraded from version 1.26 to 1.28. +.Sp +Its compilation speed has been improved slightly. +.IP \(bu 4 +parent has been upgraded from version 0.234 to 0.236. +.IP \(bu 4 +perl5db.pl has been upgraded from version 1.50 to 1.51. +.Sp +It now ignores \fI/dev/tty\fR on non-Unix systems. +[GH #12244] <https://github.com/Perl/perl5/issues/12244> +.IP \(bu 4 +Perl::OSType has been upgraded from version 1.009 to 1.010. +.IP \(bu 4 +perlfaq has been upgraded from version 5.021010 to 5.021011. +.IP \(bu 4 +PerlIO has been upgraded from version 1.09 to 1.10. +.IP \(bu 4 +PerlIO::encoding has been upgraded from version 0.24 to 0.25. +.IP \(bu 4 +PerlIO::scalar has been upgraded from version 0.24 to 0.26. +.IP \(bu 4 +Pod::Checker has been upgraded from version 1.60 to 1.73. +.IP \(bu 4 +Pod::Functions has been upgraded from version 1.10 to 1.11. +.IP \(bu 4 +Pod::Html has been upgraded from version 1.22 to 1.2202. +.IP \(bu 4 +Pod::Perldoc has been upgraded from version 3.25_02 to 3.28. +.IP \(bu 4 +Pod::Simple has been upgraded from version 3.32 to 3.35. +.IP \(bu 4 +Pod::Usage has been upgraded from version 1.68 to 1.69. +.IP \(bu 4 +POSIX has been upgraded from version 1.65 to 1.76. +.Sp +This remedies several defects in making its symbols exportable. +[GH #15260] <https://github.com/Perl/perl5/issues/15260> +.Sp +The \f(CWPOSIX::tmpnam()\fR interface has been removed, +see "\fBPOSIX::tmpnam()\fR has been removed". +.Sp +The following deprecated functions have been removed: +.Sp +.Vb 10 +\& POSIX::isalnum +\& POSIX::isalpha +\& POSIX::iscntrl +\& POSIX::isdigit +\& POSIX::isgraph +\& POSIX::islower +\& POSIX::isprint +\& POSIX::ispunct +\& POSIX::isspace +\& POSIX::isupper +\& POSIX::isxdigit +\& POSIX::tolower +\& POSIX::toupper +.Ve +.Sp +Trying to import POSIX subs that have no real implementations +(like \f(CWPOSIX::atend()\fR) now fails at import time, instead of +waiting until runtime. +.IP \(bu 4 +re has been upgraded from version 0.32 to 0.34 +.Sp +This adds support for the new \f(CW\*(C`/xx\*(C'\fR +regular expression pattern modifier, and a change to the \f(CWuse\ re\ \*(Aqstrict\*(Aq\fR experimental feature. When \f(CWre\ \*(Aqstrict\*(Aq\fR is enabled, a warning now will be generated for all +unescaped uses of the two characters \f(CW"}"\fR and \f(CW"]"\fR in regular +expression patterns (outside bracketed character classes) that are taken +literally. This brings them more in line with the \f(CW")"\fR character which +is always a metacharacter unless escaped. Being a metacharacter only +sometimes, depending on an action at a distance, can lead to silently +having the pattern mean something quite different than was intended, +which the \f(CW\*(C`re\ \*(Aqstrict\*(Aq\*(C'\fR mode is intended to minimize. +.IP \(bu 4 +Safe has been upgraded from version 2.39 to 2.40. +.IP \(bu 4 +Scalar::Util has been upgraded from version 1.42_02 to 1.46_02. +.IP \(bu 4 +Storable has been upgraded from version 2.56 to 2.62. +.Sp +Fixes +[GH #15714] <https://github.com/Perl/perl5/issues/15714>. +.IP \(bu 4 +Symbol has been upgraded from version 1.07 to 1.08. +.IP \(bu 4 +Sys::Syslog has been upgraded from version 0.33 to 0.35. +.IP \(bu 4 +Term::ANSIColor has been upgraded from version 4.04 to 4.06. +.IP \(bu 4 +Term::ReadLine has been upgraded from version 1.15 to 1.16. +.Sp +It now uses 3\-arg \f(CWopen()\fR instead of 2\-arg \f(CWopen()\fR. +[GH #15721] <https://github.com/Perl/perl5/issues/15721> +.IP \(bu 4 +Test has been upgraded from version 1.28 to 1.30. +.Sp +It now uses 3\-arg \f(CWopen()\fR instead of 2\-arg \f(CWopen()\fR. +[GH #15721] <https://github.com/Perl/perl5/issues/15721> +.IP \(bu 4 +Test::Harness has been upgraded from version 3.36 to 3.38. +.IP \(bu 4 +Test::Simple has been upgraded from version 1.001014 to 1.302073. +.IP \(bu 4 +Thread::Queue has been upgraded from version 3.09 to 3.12. +.IP \(bu 4 +Thread::Semaphore has been upgraded from 2.12 to 2.13. +.Sp +Added the \f(CW\*(C`down_timed\*(C'\fR method. +.IP \(bu 4 +threads has been upgraded from version 2.07 to 2.15. +.IP \(bu 4 +threads::shared has been upgraded from version 1.51 to 1.56. +.IP \(bu 4 +Tie::Hash::NamedCapture has been upgraded from version 0.09 to 0.10. +.IP \(bu 4 +Time::HiRes has been upgraded from version 1.9733 to 1.9741. +.Sp +It now builds on systems with C++11 compilers (such as G++ 6 and Clang++ +3.9). +.Sp +Now uses \f(CW\*(C`clockid_t\*(C'\fR. +.IP \(bu 4 +Time::Local has been upgraded from version 1.2300 to 1.25. +.IP \(bu 4 +Unicode::Collate has been upgraded from version 1.14 to 1.19. +.IP \(bu 4 +Unicode::UCD has been upgraded from version 0.64 to 0.68. +.Sp +It now uses 3\-arg \f(CWopen()\fR instead of 2\-arg \f(CWopen()\fR. +[GH #15721] <https://github.com/Perl/perl5/issues/15721> +.IP \(bu 4 +version has been upgraded from version 0.9916 to 0.9917. +.IP \(bu 4 +VMS::DCLsym has been upgraded from version 1.06 to 1.08. +.Sp +It now uses 3\-arg \f(CWopen()\fR instead of 2\-arg \f(CWopen()\fR. +[GH #15721] <https://github.com/Perl/perl5/issues/15721> +.IP \(bu 4 +warnings has been upgraded from version 1.36 to 1.37. +.IP \(bu 4 +XS::Typemap has been upgraded from version 0.14 to 0.15. +.IP \(bu 4 +XSLoader has been upgraded from version 0.21 to 0.27. +.Sp +Fixed a security hole in which binary files could be loaded from a path +outside of \f(CW@INC\fR. +.Sp +It now uses 3\-arg \f(CWopen()\fR instead of 2\-arg \f(CWopen()\fR. +[GH #15721] <https://github.com/Perl/perl5/issues/15721> +.SH Documentation +.IX Header "Documentation" +.SS "New Documentation" +.IX Subsection "New Documentation" +\fIperldeprecation\fR +.IX Subsection "perldeprecation" +.PP +This file documents all upcoming deprecations, and some of the deprecations +which already have been removed. The purpose of this documentation is +two-fold: document what will disappear, and by which version, and serve +as a guide for people dealing with code which has features that no longer +work after an upgrade of their perl. +.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, all references to Usenet have been removed, and the +following selected changes have been made: +.PP +\fIperlfunc\fR +.IX Subsection "perlfunc" +.IP \(bu 4 +Removed obsolete text about \f(CWdefined()\fR +on aggregates that should have been deleted earlier, when the feature +was removed. +.IP \(bu 4 +Corrected documentation of \f(CWeval()\fR, +and \f(CWevalbytes()\fR. +.IP \(bu 4 +Clarified documentation of \f(CWseek()\fR, +\&\f(CWtell()\fR and \f(CWsysseek()\fR +emphasizing that positions are in bytes and not characters. +[GH #15438] <https://github.com/Perl/perl5/issues/15438> +.IP \(bu 4 +Clarified documentation of \f(CWsort()\fR concerning +the variables \f(CW$a\fR and \f(CW$b\fR. +.IP \(bu 4 +In \f(CWsplit()\fR noted that certain pattern modifiers are +legal, and added a caution about its use in Perls before v5.11. +.IP \(bu 4 +Removed obsolete documentation of \f(CWstudy()\fR, noting +that it is now a no-op. +.IP \(bu 4 +Noted that \f(CWvec()\fR doesn't work well when the string +contains characters whose code points are above 255. +.PP +\fIperlguts\fR +.IX Subsection "perlguts" +.IP \(bu 4 +Added advice on +formatted printing of operands of \f(CW\*(C`Size_t\*(C'\fR and \f(CW\*(C`SSize_t\*(C'\fR +.PP +\fIperlhack\fR +.IX Subsection "perlhack" +.IP \(bu 4 +Clarify what editor tab stop rules to use, and note that we are +migrating away from using tabs, replacing them with sequences of SPACE +characters. +.PP +\fIperlhacktips\fR +.IX Subsection "perlhacktips" +.IP \(bu 4 +Give another reason to use \f(CW\*(C`cBOOL\*(C'\fR to cast an expression to boolean. +.IP \(bu 4 +Note that the macros \f(CW\*(C`TRUE\*(C'\fR and \f(CW\*(C`FALSE\*(C'\fR are available to express +boolean values. +.PP +\fIperlinterp\fR +.IX Subsection "perlinterp" +.IP \(bu 4 +perlinterp has been expanded to give a more detailed example of how to +hunt around in the parser for how a given operator is handled. +.PP +\fIperllocale\fR +.IX Subsection "perllocale" +.IP \(bu 4 +Some locales aren't compatible with Perl. Note that these can cause +core dumps. +.PP +\fIperlmod\fR +.IX Subsection "perlmod" +.IP \(bu 4 +Various clarifications have been added. +.PP +\fIperlmodlib\fR +.IX Subsection "perlmodlib" +.IP \(bu 4 +Updated the site mirror list. +.PP +\fIperlobj\fR +.IX Subsection "perlobj" +.IP \(bu 4 +Added a section on calling methods using their fully qualified names. +.IP \(bu 4 +Do not discourage manual \f(CW@ISA\fR. +.PP +\fIperlootut\fR +.IX Subsection "perlootut" +.IP \(bu 4 +Mention \f(CW\*(C`Moo\*(C'\fR more. +.PP +\fIperlop\fR +.IX Subsection "perlop" +.IP \(bu 4 +Note that white space must be used for quoting operators if the +delimiter is a word character (\fIi.e.\fR, matches \f(CW\*(C`\ew\*(C'\fR). +.IP \(bu 4 +Clarify that in regular expression patterns delimited by single quotes, +no variable interpolation is done. +.PP +\fIperlre\fR +.IX Subsection "perlre" +.IP \(bu 4 +The first part was extensively rewritten to incorporate various basic +points, that in earlier versions were mentioned in sort of an appendix +on Version 8 regular expressions. +.IP \(bu 4 +Note that it is common to have the \f(CW\*(C`/x\*(C'\fR modifier and forget that this +means that \f(CW"#"\fR has to be escaped. +.PP +\fIperlretut\fR +.IX Subsection "perlretut" +.IP \(bu 4 +Add introductory material. +.IP \(bu 4 +Note that a metacharacter occurring in a context where it can't mean +that, silently loses its meta-ness and matches literally. +\&\f(CW\*(C`use re \*(Aqstrict\*(Aq\*(C'\fR can catch some of these. +.PP +\fIperlunicode\fR +.IX Subsection "perlunicode" +.IP \(bu 4 +Corrected the text about Unicode BYTE ORDER MARK handling. +.IP \(bu 4 +Updated the text to correspond with changes in Unicode UTS#18, concerning +regular expressions, and Perl compatibility with what it says. +.PP +\fIperlvar\fR +.IX Subsection "perlvar" +.IP \(bu 4 +Document \f(CW@ISA\fR. It was documented in other places, but not in perlvar. +.SH Diagnostics +.IX Header "Diagnostics" +.SS "New Diagnostics" +.IX Subsection "New Diagnostics" +\fINew Errors\fR +.IX Subsection "New Errors" +.IP \(bu 4 +A signature parameter must start with \f(CW\*(Aq$\*(Aq\fR, \f(CW\*(Aq@\*(Aq\fR or \f(CW\*(Aq%\*(Aq\fR +.IP \(bu 4 +Bareword in require contains "%s" +.IP \(bu 4 +Bareword in require maps to empty filename +.IP \(bu 4 +Bareword in require maps to disallowed filename "%s" +.IP \(bu 4 +Bareword in require must not start with a double-colon: "%s" +.IP \(bu 4 +\&\f(CW%s:\fR command not found +.Sp +(A) You've accidentally run your script through \fBbash\fR or another shell +instead of Perl. Check the \f(CW\*(C`#!\*(C'\fR line, or manually feed your script into +Perl yourself. The \f(CW\*(C`#!\*(C'\fR line at the top of your file could look like: +.Sp +.Vb 1 +\& #!/usr/bin/perl +.Ve +.IP \(bu 4 +\&\f(CW%s:\fR command not found: \f(CW%s\fR +.Sp +(A) You've accidentally run your script through \fBzsh\fR or another shell +instead of Perl. Check the \f(CW\*(C`#!\*(C'\fR line, or manually feed your script into +Perl yourself. The \f(CW\*(C`#!\*(C'\fR line at the top of your file could look like: +.Sp +.Vb 1 +\& #!/usr/bin/perl +.Ve +.IP \(bu 4 +The experimental declared_refs feature is not enabled +.Sp +(F) To declare references to variables, as in \f(CW\*(C`my \e%x\*(C'\fR, you must first enable +the feature: +.Sp +.Vb 2 +\& no warnings "experimental::declared_refs"; +\& use feature "declared_refs"; +.Ve +.Sp +See "Declaring a reference to a variable". +.IP \(bu 4 +Illegal character following sigil in a subroutine signature +.IP \(bu 4 +Indentation on line \f(CW%d\fR of here-doc doesn't match delimiter +.IP \(bu 4 +Infinite recursion via empty pattern. +.Sp +Using the empty pattern (which re-executes the last successfully-matched +pattern) inside a code block in another regex, as in \f(CW\*(C`/(?{ s!!new! })/\*(C'\fR, has +always previously yielded a segfault. It now produces this error. +.IP \(bu 4 +Malformed UTF\-8 string in "%s" +.IP \(bu 4 +Multiple slurpy parameters not allowed +.IP \(bu 4 +\&\f(CW\*(Aq#\*(Aq\fR not allowed immediately following a sigil in a subroutine signature +.IP \(bu 4 +panic: unknown OA_*: \f(CW%x\fR +.IP \(bu 4 +Unescaped left brace in regex is illegal here +.Sp +Unescaped left braces are now illegal in some contexts in regular expression +patterns. In other contexts, they are still just deprecated; they will +be illegal in Perl 5.30. +.IP \(bu 4 +Version control conflict marker +.Sp +(F) The parser found a line starting with \f(CW\*(C`<<<<<<<\*(C'\fR, +\&\f(CW\*(C`>>>>>>>\*(C'\fR, or \f(CW\*(C`=======\*(C'\fR. These may be left by a +version control system to mark conflicts after a failed merge operation. +.PP +\fINew Warnings\fR +.IX Subsection "New Warnings" +.IP \(bu 4 +Can't determine class of operator \f(CW%s\fR, assuming \f(CW\*(C`BASEOP\*(C'\fR +.IP \(bu 4 +Declaring references is experimental +.Sp +(S experimental::declared_refs) This warning is emitted if you use a reference +constructor on the right-hand side of \f(CWmy()\fR, \f(CWstate()\fR, \f(CWour()\fR, or +\&\f(CWlocal()\fR. 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 3 +\& no warnings "experimental::declared_refs"; +\& use feature "declared_refs"; +\& $fooref = my \e$foo; +.Ve +.Sp +See "Declaring a reference to a variable". +.IP \(bu 4 +do "%s" failed, '.' is no longer in \f(CW@INC\fR +.Sp +Since \f(CW"."\fR is now removed from \f(CW@INC\fR by default, \f(CW\*(C`do\*(C'\fR will now trigger a warning recommending to fix the \f(CW\*(C`do\*(C'\fR statement. +.IP \(bu 4 +\&\f(CWFile::Glob::glob()\fR will disappear in perl 5.30. Use \f(CWFile::Glob::bsd_glob()\fR instead. +.IP \(bu 4 +Unescaped literal '%c' in regex; marked by <\-\- HERE in m/%s/ +.IP \(bu 4 +Use of unassigned code point or non-standalone grapheme for a delimiter will be a fatal error starting in Perl 5.30 +.Sp +See "Deprecations" +.SS "Changes to Existing Diagnostics" +.IX Subsection "Changes to Existing Diagnostics" +.IP \(bu 4 +When a \f(CW\*(C`require\*(C'\fR fails, we now do not provide \f(CW@INC\fR when the \f(CW\*(C`require\*(C'\fR +is for a file instead of a module. +.IP \(bu 4 +When \f(CW@INC\fR is not scanned for a \f(CW\*(C`require\*(C'\fR call, we no longer display +\&\f(CW@INC\fR to avoid confusion. +.IP \(bu 4 +Attribute "locked" is deprecated, and will disappear in Perl 5.28 +.Sp +This existing warning has had the \fIand will disappear\fR text added in this +release. +.IP \(bu 4 +Attribute "unique" is deprecated, and will disappear in Perl 5.28 +.Sp +This existing warning has had the \fIand will disappear\fR text added in this +release. +.IP \(bu 4 +Calling POSIX::%s() is deprecated +.Sp +This warning has been removed, as the deprecated functions have been +removed from POSIX. +.IP \(bu 4 +Constants from lexical variables potentially modified elsewhere are deprecated. This will not be allowed in Perl 5.32 +.Sp +This existing warning has had the \fIthis will not be allowed\fR text added +in this release. +.IP \(bu 4 +Deprecated use of \f(CWmy()\fR in false conditional. This will be a fatal error in Perl 5.30 +.Sp +This existing warning has had the \fIthis will be a fatal error\fR text added +in this release. +.IP \(bu 4 +\&\f(CWdump()\fR better written as \f(CWCORE::dump()\fR. \f(CWdump()\fR will no longer be available in Perl 5.30 +.Sp +This existing warning has had the \fIno longer be available\fR text added in +this release. +.IP \(bu 4 +Experimental \f(CW%s\fR on scalar is now forbidden +.Sp +This message is now followed by more helpful text. +[GH #15291] <https://github.com/Perl/perl5/issues/15291> +.IP \(bu 4 +Experimental "%s" subs not enabled +.Sp +This warning was been removed, as lexical subs are no longer experimental. +.IP \(bu 4 +Having more than one /%c regexp modifier is deprecated +.Sp +This deprecation warning has been removed, since \f(CW\*(C`/xx\*(C'\fR now has a new +meaning. +.IP \(bu 4 +%s() is deprecated on \f(CW\*(C`:utf8\*(C'\fR handles. This will be a fatal error in Perl 5.30 +\&. +.Sp +where "%s" is one of \f(CW\*(C`sysread\*(C'\fR, \f(CW\*(C`recv\*(C'\fR, \f(CW\*(C`syswrite\*(C'\fR, or \f(CW\*(C`send\*(C'\fR. +.Sp +This existing warning has had the \fIthis will be a fatal error\fR text added +in this release. +.Sp +This warning is now enabled by default, as all \f(CW\*(C`deprecated\*(C'\fR category +warnings should be. +.IP \(bu 4 +\&\f(CW$*\fR is no longer supported. Its use will be fatal in Perl 5.30 +.Sp +This existing warning has had the \fIits use will be fatal\fR text added in +this release. +.IP \(bu 4 +\&\f(CW$#\fR is no longer supported. Its use will be fatal in Perl 5.30 +.Sp +This existing warning has had the \fIits use will be fatal\fR text added in +this release. +.IP \(bu 4 +Malformed UTF\-8 character%s +.Sp +Details as to the exact problem have been added at the end of this +message +.IP \(bu 4 +Missing or undefined argument to \f(CW%s\fR +.Sp +This warning used to warn about \f(CW\*(C`require\*(C'\fR, even if it was actually \f(CW\*(C`do\*(C'\fR +which being executed. It now gets the operation name right. +.IP \(bu 4 +NO-BREAK SPACE in a charnames alias definition is deprecated +.Sp +This warning has been removed as the behavior is now an error. +.IP \(bu 4 +Odd name/value argument for subroutine '%s' +.Sp +This warning now includes the name of the offending subroutine. +.IP \(bu 4 +Opening dirhandle \f(CW%s\fR also as a file. This will be a fatal error in Perl 5.28 +.Sp +This existing warning has had the \fIthis will be a fatal error\fR text added +in this release. +.IP \(bu 4 +Opening filehandle \f(CW%s\fR also as a directory. This will be a fatal error in Perl 5.28 +.Sp +This existing warning has had the \fIthis will be a fatal error\fR text added +in this release. +.IP \(bu 4 +panic: ck_split, type=%u +.Sp +panic: pp_split, pm=%p, s=%p +.Sp +These panic errors have been removed. +.IP \(bu 4 +Passing malformed UTF\-8 to "%s" is deprecated +.Sp +This warning has been changed to the fatal +Malformed UTF\-8 string in "%s" +.IP \(bu 4 +Setting \f(CW$/\fR to a reference to \f(CW%s\fR as a form of slurp is deprecated, treating as undef. This will be fatal in Perl 5.28 +.Sp +This existing warning has had the \fIthis will be fatal\fR text added in +this release. +.IP \(bu 4 +\&\f(CW\*(C`${^ENCODING}\*(C'\fR is no longer supported. Its use will be fatal in Perl 5.28 +.Sp +This warning used to be: "Setting \f(CW\*(C`${^ENCODING}\*(C'\fR is deprecated". +.Sp +The special action of the variable \f(CW\*(C`${^ENCODING}\*(C'\fR was formerly used to +implement the \f(CW\*(C`encoding\*(C'\fR pragma. As of Perl 5.26, rather than being +deprecated, assigning to this variable now has no effect except to issue +the warning. +.IP \(bu 4 +Too few arguments for subroutine '%s' +.Sp +This warning now includes the name of the offending subroutine. +.IP \(bu 4 +Too many arguments for subroutine '%s' +.Sp +This warning now includes the name of the offending subroutine. +.IP \(bu 4 +Unescaped left brace in regex is deprecated here (and will be fatal in Perl 5.30), passed through in regex; marked by <\-\-\ HERE in m/%s/ +.Sp +This existing warning has had the \fIhere (and will be fatal...)\fR text +added in this release. +.IP \(bu 4 +Unknown charname '' is deprecated. Its use will be fatal in Perl 5.28 +.Sp +This existing warning has had the \fIits use will be fatal\fR text added in +this release. +.IP \(bu 4 +Use of bare << to mean <<"" is deprecated. Its use will be fatal in Perl 5.28 +.Sp +This existing warning has had the \fIits use will be fatal\fR text added in +this release. +.IP \(bu 4 +Use of code point 0x%s is deprecated; the permissible max is 0x%s. This will be fatal in Perl 5.28 +.Sp +This existing warning has had the \fIthis will be fatal\fR text added in +this release. +.IP \(bu 4 +Use of comma-less variable list is deprecated. Its use will be fatal in Perl 5.28 +.Sp +This existing warning has had the \fIits use will be fatal\fR text added in +this release. +.IP \(bu 4 +Use of inherited \f(CW\*(C`AUTOLOAD\*(C'\fR for non-method %s() is deprecated. This will be fatal in Perl 5.28 +.Sp +This existing warning has had the \fIthis will be fatal\fR text added in +this release. +.IP \(bu 4 +Use of strings with code points over 0xFF as arguments to \f(CW%s\fR operator is deprecated. This will be a fatal error in Perl 5.28 +.Sp +This existing warning has had the \fIthis will be a fatal error\fR text added in +this release. +.SH "Utility Changes" +.IX Header "Utility Changes" +.SS "\fIc2ph\fP and \fIpstruct\fP" +.IX Subsection "c2ph and pstruct" +.IP \(bu 4 +These old utilities have long since superceded by h2xs, and are +now gone from the distribution. +.SS \fIPorting/pod_lib.pl\fP +.IX Subsection "Porting/pod_lib.pl" +.IP \(bu 4 +Removed spurious executable bit. +.IP \(bu 4 +Account for the possibility of DOS file endings. +.SS \fIPorting/sync\-with\-cpan\fP +.IX Subsection "Porting/sync-with-cpan" +.IP \(bu 4 +Many improvements. +.SS \fIperf/benchmarks\fP +.IX Subsection "perf/benchmarks" +.IP \(bu 4 +Tidy file, rename some symbols. +.SS \fIPorting/checkAUTHORS.pl\fP +.IX Subsection "Porting/checkAUTHORS.pl" +.IP \(bu 4 +Replace obscure character range with \f(CW\*(C`\ew\*(C'\fR. +.SS \fIt/porting/regen.t\fP +.IX Subsection "t/porting/regen.t" +.IP \(bu 4 +Try to be more helpful when tests fail. +.SS \fIutils/h2xs.PL\fP +.IX Subsection "utils/h2xs.PL" +.IP \(bu 4 +Avoid infinite loop for enums. +.SS perlbug +.IX Subsection "perlbug" +.IP \(bu 4 +Long lines in the message body are now wrapped at 900 characters, to stay +well within the 1000\-character limit imposed by SMTP mail transfer agents. +This is particularly likely to be important for the list of arguments to +\&\fIConfigure\fR, which can readily exceed the limit if, for example, it names +several non-default installation paths. This change also adds the first unit +tests for perlbug. +[perl #128020] <https://rt.perl.org/Public/Bug/Display.html?id=128020> +.SH "Configuration and Compilation" +.IX Header "Configuration and Compilation" +.IP \(bu 4 +\&\f(CW\*(C`\-Ddefault_inc_excludes_dot\*(C'\fR has added, and enabled by default. +.IP \(bu 4 +The \f(CW\*(C`dtrace\*(C'\fR build process has further changes +[GH #15718] <https://github.com/Perl/perl5/issues/15718>: +.RS 4 +.IP \(bu 4 +If the \f(CW\*(C`\-xnolibs\*(C'\fR is available, use that so a \fIdtrace\fR perl can be +built within a FreeBSD jail. +.IP \(bu 4 +On systems that build a \fIdtrace\fR object file (FreeBSD, Solaris, and +SystemTap's dtrace emulation), copy the input objects to a separate +directory and process them there, and use those objects in the link, +since \f(CW\*(C`dtrace \-G\*(C'\fR also modifies these objects. +.IP \(bu 4 +Add \fIlibelf\fR to the build on FreeBSD 10.x, since \fIdtrace\fR adds +references to \fIlibelf\fR symbols. +.IP \(bu 4 +Generate a dummy \fIdtrace_main.o\fR if \f(CW\*(C`dtrace \-G\*(C'\fR fails to build it. A +default build on Solaris generates probes from the unused inline +functions, while they don't on FreeBSD, which causes \f(CW\*(C`dtrace \-G\*(C'\fR to +fail. +.RE +.RS 4 +.RE +.IP \(bu 4 +You can now disable perl's use of the \f(CW\*(C`PERL_HASH_SEED\*(C'\fR and +\&\f(CW\*(C`PERL_PERTURB_KEYS\*(C'\fR environment variables by configuring perl with +\&\f(CW\*(C`\-Accflags=NO_PERL_HASH_ENV\*(C'\fR. +.IP \(bu 4 +You can now disable perl's use of the \f(CW\*(C`PERL_HASH_SEED_DEBUG\*(C'\fR environment +variable by configuring perl with +\&\f(CW\*(C`\-Accflags=\-DNO_PERL_HASH_SEED_DEBUG\*(C'\fR. +.IP \(bu 4 +\&\fIConfigure\fR now zeroes out the alignment bytes when calculating the bytes +for 80\-bit \f(CW\*(C`NaN\*(C'\fR and \f(CW\*(C`Inf\*(C'\fR to make builds more reproducible. +[GH #15725] <https://github.com/Perl/perl5/issues/15725> +.IP \(bu 4 +Since v5.18, for testing purposes we have included support for +building perl with a variety of non-standard, and non-recommended +hash functions. Since we do not recommend the use of these functions, +we have removed them and their corresponding build options. Specifically +this includes the following build options: +.Sp +.Vb 8 +\& PERL_HASH_FUNC_SDBM +\& PERL_HASH_FUNC_DJB2 +\& PERL_HASH_FUNC_SUPERFAST +\& PERL_HASH_FUNC_MURMUR3 +\& PERL_HASH_FUNC_ONE_AT_A_TIME +\& PERL_HASH_FUNC_ONE_AT_A_TIME_OLD +\& PERL_HASH_FUNC_MURMUR_HASH_64A +\& PERL_HASH_FUNC_MURMUR_HASH_64B +.Ve +.IP \(bu 4 +Remove "Warning: perl appears in your path" +.Sp +This install warning is more or less obsolete, since most platforms already +\&\fBwill\fR have a \fI/usr/bin/perl\fR or similar provided by the OS. +.IP \(bu 4 +Reduce verbosity of \f(CW\*(C`make install.man\*(C'\fR +.Sp +Previously, two progress messages were emitted for each manpage: one by +installman itself, and one by the function in \fIinstall_lib.pl\fR that it calls to +actually install the file. Disabling the second of those in each case saves +over 750 lines of unhelpful output. +.IP \(bu 4 +Cleanup for \f(CW\*(C`clang \-Weverything\*(C'\fR support. +[GH #15683] <https://github.com/Perl/perl5/issues/15683> +.IP \(bu 4 +\&\fIConfigure\fR: signbit scan was assuming too much, stop assuming negative 0. +.IP \(bu 4 +Various compiler warnings have been silenced. +.IP \(bu 4 +Several smaller changes have been made to remove impediments to compiling +under C++11. +.IP \(bu 4 +Builds using \f(CW\*(C`USE_PAD_RESET\*(C'\fR now work again; this configuration had +bit-rotted. +.IP \(bu 4 +A probe for \f(CW\*(C`gai_strerror\*(C'\fR was added to \fIConfigure\fR that checks if +the \f(CWgai_strerror()\fR routine is available and can be used to +translate error codes returned by \f(CWgetaddrinfo()\fR into human +readable strings. +.IP \(bu 4 +\&\fIConfigure\fR now aborts if both \f(CW\*(C`\-Duselongdouble\*(C'\fR and \f(CW\*(C`\-Dusequadmath\*(C'\fR are +requested. +[GH #14944] <https://github.com/Perl/perl5/issues/14944> +.IP \(bu 4 +Fixed a bug in which \fIConfigure\fR could append \f(CW\*(C`\-quadmath\*(C'\fR to the +archname even if it was already present. +[GH #15423] <https://github.com/Perl/perl5/issues/15423> +.IP \(bu 4 +Clang builds with \f(CW\*(C`\-DPERL_GLOBAL_STRUCT\*(C'\fR or +\&\f(CW\*(C`\-DPERL_GLOBAL_STRUCT_PRIVATE\*(C'\fR have +been fixed (by disabling Thread Safety Analysis for these configurations). +.IP \(bu 4 +\&\fImake_ext.pl\fR no longer updates a module's \fIpm_to_blib\fR file when no +files require updates. This could cause dependencies, \fIperlmain.c\fR +in particular, to be rebuilt unnecessarily. +[GH #15060] <https://github.com/Perl/perl5/issues/15060> +.IP \(bu 4 +The output of \f(CW\*(C`perl \-V\*(C'\fR has been reformatted so that each configuration +and compile-time option is now listed one per line, to improve +readability. +.IP \(bu 4 +\&\fIConfigure\fR now builds \f(CW\*(C`miniperl\*(C'\fR and \f(CW\*(C`generate_uudmap\*(C'\fR if you +invoke it with \f(CW\*(C`\-Dusecrosscompiler\*(C'\fR but not \f(CW\*(C`\-Dtargethost=somehost\*(C'\fR. +This means you can supply your target platform \f(CW\*(C`config.sh\*(C'\fR, generate +the headers and proceed to build your cross-target perl. +[GH #15126] <https://github.com/Perl/perl5/issues/15126> +.IP \(bu 4 +Perl built with \f(CW\*(C`\-Accflags=\-DPERL_TRACE_OPS\*(C'\fR now only dumps the operator +counts when the environment variable \f(CW\*(C`PERL_TRACE_OPS\*(C'\fR is set to a +non-zero integer. This allows \f(CW\*(C`make test\*(C'\fR to pass on such a build. +.IP \(bu 4 +When building with GCC 6 and link-time optimization (the \f(CW\*(C`\-flto\*(C'\fR option to +\&\f(CW\*(C`gcc\*(C'\fR), \fIConfigure\fR was treating all probed symbols as present on the +system, regardless of whether they actually exist. This has been fixed. +[GH #15322] <https://github.com/Perl/perl5/issues/15322> +.IP \(bu 4 +The \fIt/test.pl\fR library is used for internal testing of Perl itself, and +also copied by several CPAN modules. Some of those modules must work on +older versions of Perl, so \fIt/test.pl\fR must in turn avoid newer Perl +features. Compatibility with Perl 5.8 was inadvertently removed some time +ago; it has now been restored. +[GH #15302] <https://github.com/Perl/perl5/issues/15302> +.IP \(bu 4 +The build process no longer emits an extra blank line before building each +"simple" extension (those with only \fI*.pm\fR and \fI*.pod\fR files). +.SH Testing +.IX Header "Testing" +Tests were added and changed to reflect the other additions and changes +in this release. Furthermore, these substantive changes were made: +.IP \(bu 4 +A new test script, \fIcomp/parser_run.t\fR, has been added that is like +\&\fIcomp/parser.t\fR but with \fItest.pl\fR included so that \f(CWrunperl()\fR and the +like are available for use. +.IP \(bu 4 +Tests for locales were erroneously using locales incompatible with Perl. +.IP \(bu 4 +Some parts of the test suite that try to exhaustively test edge cases in the +regex implementation have been restricted to running for a maximum of five +minutes. On slow systems they could otherwise take several hours, without +significantly improving our understanding of the correctness of the code +under test. +.IP \(bu 4 +A new internal facility allows analysing the time taken by the individual +tests in Perl's own test suite; see \fIPorting/harness\-timer\-report.pl\fR. +.IP \(bu 4 +\&\fIt/re/regexp_nonull.t\fR has been added to test that the regular expression +engine can handle scalars that do not have a null byte just past the end of +the string. +.IP \(bu 4 +A new test script, \fIt/op/decl\-refs.t\fR, has been added to test the new feature +"Declaring a reference to a variable". +.IP \(bu 4 +A new test script, \fIt/re/keep_tabs.t\fR has been added to contain tests +where \f(CW\*(C`\et\*(C'\fR characters should not be expanded into spaces. +.IP \(bu 4 +A new test script, \fIt/re/anyof.t\fR, has been added to test that the ANYOF nodes +generated by bracketed character classes are as expected. +.IP \(bu 4 +There is now more extensive testing of the Unicode-related API macros +and functions. +.IP \(bu 4 +Several of the longer running API test files have been split into +multiple test files so that they can be run in parallel. +.IP \(bu 4 +\&\fIt/harness\fR now tries really hard not to run tests which are located +outside of the Perl source tree. +[GH #14578] <https://github.com/Perl/perl5/issues/14578> +.IP \(bu 4 +Prevent debugger tests (\fIlib/perl5db.t\fR) from failing due to the contents +of \f(CW$ENV{PERLDB_OPTS}\fR. +[GH #15782] <https://github.com/Perl/perl5/issues/15782> +.SH "Platform Support" +.IX Header "Platform Support" +.SS "New Platforms" +.IX Subsection "New Platforms" +.IP NetBSD/VAX 4 +.IX Item "NetBSD/VAX" +Perl now compiles under NetBSD on VAX machines. However, it's not +possible for that platform to implement floating-point infinities and +NaNs compatible with most modern systems, which implement the IEEE\-754 +floating point standard. The hexadecimal floating point (\f(CW\*(C`0x...p[+\-]n\*(C'\fR +literals, \f(CW\*(C`printf %a\*(C'\fR) is not implemented, either. +The \f(CW\*(C`make test\*(C'\fR passes 98% of tests. +.RS 4 +.IP \(bu 4 +Test fixes and minor updates. +.IP \(bu 4 +Account for lack of \f(CW\*(C`inf\*(C'\fR, \f(CW\*(C`nan\*(C'\fR, and \f(CW\-0.0\fR support. +.RE +.RS 4 +.RE +.SS "Platform-Specific Notes" +.IX Subsection "Platform-Specific Notes" +.IP Darwin 4 +.IX Item "Darwin" +.RS 4 +.PD 0 +.IP \(bu 4 +.PD +Don't treat \f(CW\*(C`\-Dprefix=/usr\*(C'\fR as special: instead require an extra option +\&\f(CW\*(C`\-Ddarwin_distribution\*(C'\fR to produce the same results. +.IP \(bu 4 +OS X El Capitan doesn't implement the \f(CWclock_gettime()\fR or +\&\f(CWclock_getres()\fR APIs; emulate them as necessary. +.IP \(bu 4 +Deprecated \f(CWsyscall(2)\fR on macOS 10.12. +.RE +.RS 4 +.RE +.IP EBCDIC 4 +.IX Item "EBCDIC" +Several tests have been updated to work (or be skipped) on EBCDIC platforms. +.IP HP-UX 4 +.IX Item "HP-UX" +The Net::Ping UDP test is now skipped on HP-UX. +.IP Hurd 4 +.IX Item "Hurd" +The hints for Hurd have been improved, enabling malloc wrap and reporting the +GNU libc used (previously it was an empty string when reported). +.IP VAX 4 +.IX Item "VAX" +VAX floating point formats are now supported on NetBSD. +.IP VMS 4 +.IX Item "VMS" +.RS 4 +.PD 0 +.IP \(bu 4 +.PD +The path separator for the \f(CW\*(C`PERL5LIB\*(C'\fR and \f(CW\*(C`PERLLIB\*(C'\fR environment entries is +now a colon (\f(CW":"\fR) when running under a Unix shell. There is no change when +running under DCL (it's still \f(CW"|"\fR). +.IP \(bu 4 +\&\fIconfigure.com\fR now recognizes the VSI-branded C compiler and no longer +recognizes the "DEC"\-branded C compiler (as there hasn't been such a thing for +15 or more years). +.RE +.RS 4 +.RE +.IP Windows 4 +.IX Item "Windows" +.RS 4 +.PD 0 +.IP \(bu 4 +.PD +Support for compiling perl on Windows using Microsoft Visual Studio 2015 +(containing Visual C++ 14.0) has been added. +.Sp +This version of VC++ includes a completely rewritten C run-time library, some +of the changes in which mean that work done to resolve a socket +\&\f(CWclose()\fR bug in +perl #120091 and perl #118059 is not workable in its current state with this +version of VC++. Therefore, we have effectively reverted that bug fix for +VS2015 onwards on the basis that being able to build with VS2015 onwards is +more important than keeping the bug fix. We may revisit this in the future to +attempt to fix the bug again in a way that is compatible with VS2015. +.Sp +These changes do not affect compilation with GCC or with Visual Studio versions +up to and including VS2013, \fIi.e.\fR, the bug fix is retained (unchanged) for those +compilers. +.Sp +Note that you may experience compatibility problems if you mix a perl built +with GCC or VS <= VS2013 with XS modules built with VS2015, or if you mix a +perl built with VS2015 with XS modules built with GCC or VS <= VS2013. +Some incompatibility may arise because of the bug fix that has been reverted +for VS2015 builds of perl, but there may well be incompatibility anyway because +of the rewritten CRT in VS2015 (\fIe.g.\fR, see discussion at +<http://stackoverflow.com/questions/30412951>). +.IP \(bu 4 +It now automatically detects GCC versus Visual C and sets the VC version +number on Win32. +.RE +.RS 4 +.RE +.IP Linux 4 +.IX Item "Linux" +Drop support for Linux \fIa.out\fR executable format. Linux has used ELF for +over twenty years. +.IP "OpenBSD 6" 4 +.IX Item "OpenBSD 6" +OpenBSD 6 still does not support returning \f(CW\*(C`pid\*(C'\fR, \f(CW\*(C`gid\*(C'\fR, or \f(CW\*(C`uid\*(C'\fR with +\&\f(CW\*(C`SA_SIGINFO\*(C'\fR. Make sure to account for it. +.IP FreeBSD 4 +.IX Item "FreeBSD" +\&\fIt/uni/overload.t\fR: Skip hanging test on FreeBSD. +.IP "DragonFly BSD" 4 +.IX Item "DragonFly BSD" +DragonFly BSD now has support for \f(CWsetproctitle()\fR. +[GH #15703] <https://github.com/Perl/perl5/issues/15703>. +.SH "Internal Changes" +.IX Header "Internal Changes" +.IP \(bu 4 +A new API function \f(CWsv_setpv_bufsize()\fR +allows simultaneously setting the +length and the allocated size of the buffer in an \f(CW\*(C`SV\*(C'\fR, growing the +buffer if necessary. +.IP \(bu 4 +A new API macro \f(CWSvPVCLEAR()\fR sets its \f(CW\*(C`SV\*(C'\fR +argument to an empty string, +like Perl-space \f(CW\*(C`$x = \*(Aq\*(Aq\*(C'\fR, but with several optimisations. +.IP \(bu 4 +Several new macros and functions for dealing with Unicode and +UTF\-8\-encoded strings have been added to the API, as well as some +changes in the +functionality of existing functions (see "Unicode Support" in perlapi for +more details): +.RS 4 +.IP \(bu 4 +New versions of the API macros like \f(CW\*(C`isALPHA_utf8\*(C'\fR and \f(CW\*(C`toLOWER_utf8\*(C'\fR +have been added, each with the suffix \f(CW\*(C`_safe\*(C'\fR, like +\&\f(CW\*(C`isSPACE_utf8_safe\*(C'\fR. These take an extra +parameter, giving an upper +limit of how far into the string it is safe to read. Using the old +versions could cause attempts to read beyond the end of the input buffer +if the UTF\-8 is not well-formed, and their use now raises a deprecation +warning. Details are at "Character classification" in perlapi. +.IP \(bu 4 +Macros like \f(CW\*(C`isALPHA_utf8\*(C'\fR and +\&\f(CW\*(C`toLOWER_utf8\*(C'\fR now die if they detect +that their input UTF\-8 is malformed. A deprecation warning had been +issued since Perl 5.18. +.IP \(bu 4 +Several new macros for analysing the validity of utf8 sequences. These +are: +.Sp +\&\f(CW\*(C`UTF8_GOT_ABOVE_31_BIT\*(C'\fR +\&\f(CW\*(C`UTF8_GOT_CONTINUATION\*(C'\fR +\&\f(CW\*(C`UTF8_GOT_EMPTY\*(C'\fR +\&\f(CW\*(C`UTF8_GOT_LONG\*(C'\fR +\&\f(CW\*(C`UTF8_GOT_NONCHAR\*(C'\fR +\&\f(CW\*(C`UTF8_GOT_NON_CONTINUATION\*(C'\fR +\&\f(CW\*(C`UTF8_GOT_OVERFLOW\*(C'\fR +\&\f(CW\*(C`UTF8_GOT_SHORT\*(C'\fR +\&\f(CW\*(C`UTF8_GOT_SUPER\*(C'\fR +\&\f(CW\*(C`UTF8_GOT_SURROGATE\*(C'\fR +\&\f(CW\*(C`UTF8_IS_INVARIANT\*(C'\fR +\&\f(CW\*(C`UTF8_IS_NONCHAR\*(C'\fR +\&\f(CW\*(C`UTF8_IS_SUPER\*(C'\fR +\&\f(CW\*(C`UTF8_IS_SURROGATE\*(C'\fR +\&\f(CW\*(C`UVCHR_IS_INVARIANT\*(C'\fR +\&\f(CW\*(C`isUTF8_CHAR_flags\*(C'\fR +\&\f(CW\*(C`isSTRICT_UTF8_CHAR\*(C'\fR +\&\f(CW\*(C`isC9_STRICT_UTF8_CHAR\*(C'\fR +.IP \(bu 4 +Functions that are all extensions of the \f(CW\*(C`is_utf8_string_\fR\f(CI*\fR\f(CW()\*(C'\fR functions, +that apply various restrictions to the UTF\-8 recognized as valid: +.Sp +\&\f(CW\*(C`is_strict_utf8_string\*(C'\fR, +\&\f(CW\*(C`is_strict_utf8_string_loc\*(C'\fR, +\&\f(CW\*(C`is_strict_utf8_string_loclen\*(C'\fR, +.Sp +\&\f(CW\*(C`is_c9strict_utf8_string\*(C'\fR, +\&\f(CW\*(C`is_c9strict_utf8_string_loc\*(C'\fR, +\&\f(CW\*(C`is_c9strict_utf8_string_loclen\*(C'\fR, +.Sp +\&\f(CW\*(C`is_utf8_string_flags\*(C'\fR, +\&\f(CW\*(C`is_utf8_string_loc_flags\*(C'\fR, +\&\f(CW\*(C`is_utf8_string_loclen_flags\*(C'\fR, +.Sp +\&\f(CW\*(C`is_utf8_fixed_width_buf_flags\*(C'\fR, +\&\f(CW\*(C`is_utf8_fixed_width_buf_loc_flags\*(C'\fR, +\&\f(CW\*(C`is_utf8_fixed_width_buf_loclen_flags\*(C'\fR. +.Sp +\&\f(CW\*(C`is_utf8_invariant_string\*(C'\fR. +\&\f(CW\*(C`is_utf8_valid_partial_char\*(C'\fR. +\&\f(CW\*(C`is_utf8_valid_partial_char_flags\*(C'\fR. +.IP \(bu 4 +The functions \f(CW\*(C`utf8n_to_uvchr\*(C'\fR and its +derivatives have had several changes of behaviour. +.Sp +Calling them, while passing a string length of 0 is now asserted against +in DEBUGGING builds, and otherwise, returns the Unicode REPLACEMENT +CHARACTER. If you have nothing to decode, you shouldn't call the decode +function. +.Sp +They now return the Unicode REPLACEMENT CHARACTER if called with UTF\-8 +that has the overlong malformation and that malformation is allowed by +the input parameters. This malformation is where the UTF\-8 looks valid +syntactically, but there is a shorter sequence that yields the same code +point. This has been forbidden since Unicode version 3.1. +.Sp +They now accept an input +flag to allow the overflow malformation. This malformation is when the +UTF\-8 may be syntactically valid, but the code point it represents is +not capable of being represented in the word length on the platform. +What "allowed" means, in this case, is that the function doesn't return an +error, and it advances the parse pointer to beyond the UTF\-8 in +question, but it returns the Unicode REPLACEMENT CHARACTER as the value +of the code point (since the real value is not representable). +.Sp +They no longer abandon searching for other malformations when the first +one is encountered. A call to one of these functions thus can generate +multiple diagnostics, instead of just one. +.IP \(bu 4 +\&\f(CWvalid_utf8_to_uvchr()\fR has been added +to the API (although it was +present in core earlier). Like \f(CWutf8_to_uvchr_buf()\fR, but assumes that +the next character is well-formed. Use with caution. +.IP \(bu 4 +A new function, \f(CW\*(C`utf8n_to_uvchr_error\*(C'\fR, +has been added for +use by modules that need to know the details of UTF\-8 malformations +beyond pass/fail. Previously, the only ways to know why a sequence was +ill-formed was to capture and parse the generated diagnostics or to do +your own analysis. +.IP \(bu 4 +There is now a safer version of \fButf8_hop()\fR, called +\&\f(CWutf8_hop_safe()\fR. +Unlike \fButf8_hop()\fR, \fButf8_hop_safe()\fR won't navigate before the beginning or +after the end of the supplied buffer. +.IP \(bu 4 +Two new functions, \f(CWutf8_hop_forward()\fR and +\&\f(CWutf8_hop_back()\fR are +similar to \f(CWutf8_hop_safe()\fR but are for when you know which direction +you wish to travel. +.IP \(bu 4 +Two new macros which return useful utf8 byte sequences: +.Sp +\&\f(CW\*(C`BOM_UTF8\*(C'\fR +.Sp +\&\f(CW\*(C`REPLACEMENT_CHARACTER_UTF8\*(C'\fR +.RE +.RS 4 +.RE +.IP \(bu 4 +Perl is now built with the \f(CW\*(C`PERL_OP_PARENT\*(C'\fR compiler define enabled by +default. To disable it, use the \f(CW\*(C`PERL_NO_OP_PARENT\*(C'\fR compiler define. +This flag alters how the \f(CW\*(C`op_sibling\*(C'\fR field is used in \f(CW\*(C`OP\*(C'\fR structures, +and has been available optionally since perl 5.22. +.Sp +See "Internal Changes" in perl5220delta for more details of what this +build option does. +.IP \(bu 4 +Three new ops, \f(CW\*(C`OP_ARGELEM\*(C'\fR, \f(CW\*(C`OP_ARGDEFELEM\*(C'\fR, and \f(CW\*(C`OP_ARGCHECK\*(C'\fR have +been added. These are intended principally to implement the individual +elements of a subroutine signature, plus any overall checking required. +.IP \(bu 4 +The \f(CW\*(C`OP_PUSHRE\*(C'\fR op has been eliminated and the \f(CW\*(C`OP_SPLIT\*(C'\fR op has been +changed from class \f(CW\*(C`LISTOP\*(C'\fR to \f(CW\*(C`PMOP\*(C'\fR. +.Sp +Formerly the first child of a split would be a \f(CW\*(C`pushre\*(C'\fR, which would have the +\&\f(CW\*(C`split\*(C'\fR's regex attached to it. Now the regex is attached directly to the +\&\f(CW\*(C`split\*(C'\fR op, and the \f(CW\*(C`pushre\*(C'\fR has been eliminated. +.IP \(bu 4 +The \f(CWop_class()\fR API function has been added. This +is like the existing +\&\f(CWOP_CLASS()\fR macro, but can more accurately determine what struct an op +has been allocated as. For example \f(CWOP_CLASS()\fR might return +\&\f(CW\*(C`OA_BASEOP_OR_UNOP\*(C'\fR indicating that ops of this type are usually +allocated as an \f(CW\*(C`OP\*(C'\fR or \f(CW\*(C`UNOP\*(C'\fR; while \f(CWop_class()\fR will return +\&\f(CW\*(C`OPclass_BASEOP\*(C'\fR or \f(CW\*(C`OPclass_UNOP\*(C'\fR as appropriate. +.IP \(bu 4 +All parts of the internals now agree that the \f(CW\*(C`sassign\*(C'\fR op is a \f(CW\*(C`BINOP\*(C'\fR; +previously it was listed as a \f(CW\*(C`BASEOP\*(C'\fR in \fIregen/opcodes\fR, which meant +that several parts of the internals had to be special-cased to accommodate +it. This oddity's original motivation was to handle code like \f(CW\*(C`$x ||= 1\*(C'\fR; +that is now handled in a simpler way. +.IP \(bu 4 +The output format of the \f(CWop_dump()\fR function (as +used by \f(CW\*(C`perl \-Dx\*(C'\fR) +has changed: it now displays an "ASCII-art" tree structure, and shows more +low-level details about each op, such as its address and class. +.IP \(bu 4 +The \f(CW\*(C`PADOFFSET\*(C'\fR type has changed from being unsigned to signed, and +several pad-related variables such as \f(CW\*(C`PL_padix\*(C'\fR have changed from being +of type \f(CW\*(C`I32\*(C'\fR to type \f(CW\*(C`PADOFFSET\*(C'\fR. +.IP \(bu 4 +The \f(CW\*(C`DEBUGGING\*(C'\fR\-mode output for regex compilation and execution has been +enhanced. +.IP \(bu 4 +Several obscure SV flags have been eliminated, sometimes along with the +macros which manipulate them: \f(CW\*(C`SVpbm_VALID\*(C'\fR, \f(CW\*(C`SVpbm_TAIL\*(C'\fR, \f(CW\*(C`SvTAIL_on\*(C'\fR, +\&\f(CW\*(C`SvTAIL_off\*(C'\fR, \f(CW\*(C`SVrepl_EVAL\*(C'\fR, \f(CW\*(C`SvEVALED\*(C'\fR. +.IP \(bu 4 +An OP \f(CW\*(C`op_private\*(C'\fR flag has been eliminated: \f(CW\*(C`OPpRUNTIME\*(C'\fR. This used to +often get set on \f(CW\*(C`PMOP\*(C'\fR ops, but had become meaningless over time. +.SH "Selected Bug Fixes" +.IX Header "Selected Bug Fixes" +.IP \(bu 4 +Perl no longer panics when switching into some locales on machines with +buggy \f(CWstrxfrm()\fR implementations in their \fIlibc\fR. +[GH #13768] <https://github.com/Perl/perl5/issues/13768> +.IP \(bu 4 +\&\f(CW\*(C` $\-{$name} \*(C'\fR would leak an \f(CW\*(C`AV\*(C'\fR on each access if the regular +expression had no named captures. The same applies to access to any +hash tied with Tie::Hash::NamedCapture and \f(CW\*(C`all => 1\*(C'\fR. +[GH #15882] <https://github.com/Perl/perl5/issues/15882> +.IP \(bu 4 +Attempting to use the deprecated variable \f(CW$#\fR as the object in an +indirect object method call could cause a heap use after free or +buffer overflow. +[GH #15599] <https://github.com/Perl/perl5/issues/15599> +.IP \(bu 4 +When checking for an indirect object method call, in some rare cases +the parser could reallocate the line buffer but then continue to use +pointers to the old buffer. +[GH #15585] <https://github.com/Perl/perl5/issues/15585> +.IP \(bu 4 +Supplying a glob as the format argument to +\&\f(CW\*(C`formline\*(C'\fR would +cause an assertion failure. +[GH #15862] <https://github.com/Perl/perl5/issues/15862> +.IP \(bu 4 +Code like \f(CW\*(C` $value1 =~ qr/.../ ~~ $value2 \*(C'\fR would have the match +converted into a \f(CW\*(C`qr//\*(C'\fR operator, leaving extra elements on the stack to +confuse any surrounding expression. +[GH #15859] <https://github.com/Perl/perl5/issues/15859> +.IP \(bu 4 +Since v5.24 in some obscure cases, a regex which included code blocks +from multiple sources (\fIe.g.\fR, via embedded via \f(CW\*(C`qr//\*(C'\fR objects) could end up +with the wrong current pad and crash or give weird results. +[GH #15657] <https://github.com/Perl/perl5/issues/15657> +.IP \(bu 4 +Occasionally \f(CWlocal()\fRs in a code block within a patterns weren't being +undone when the pattern matching backtracked over the code block. +[GH #15056] <https://github.com/Perl/perl5/issues/15056> +.IP \(bu 4 +Using \f(CWsubstr()\fR to modify a magic variable could access freed memory +in some cases. +[GH #15871] <https://github.com/Perl/perl5/issues/15871> +.IP \(bu 4 +Under \f(CW\*(C`use utf8\*(C'\fR, the entire source code is now checked for being UTF\-8 +well formed, not just quoted strings as before. +[GH #14973] <https://github.com/Perl/perl5/issues/14973>. +.IP \(bu 4 +The range operator \f(CW".."\fR on strings now handles its arguments correctly when in +the scope of the \f(CW\*(C`unicode_strings\*(C'\fR +feature. The previous behaviour was sufficiently unexpected that we believe no +correct program could have made use of it. +.IP \(bu 4 +The \f(CW\*(C`split\*(C'\fR operator did not ensure enough space was allocated for +its return value in scalar context. It could then write a single +pointer immediately beyond the end of the memory block allocated for +the stack. +[GH #15749] <https://github.com/Perl/perl5/issues/15749> +.IP \(bu 4 +Using a large code point with the \f(CW"W"\fR pack template character with +the current output position aligned at just the right point could +cause a write of a single zero byte immediately beyond the end of an +allocated buffer. +[GH #15572] <https://github.com/Perl/perl5/issues/15572> +.IP \(bu 4 +Supplying a format's picture argument as part of the format argument list +where the picture specifies modifying the argument could cause an +access to the new freed compiled format. +[GH #15566] <https://github.com/Perl/perl5/issues/15566> +.IP \(bu 4 +The \fBsort()\fR operator's built-in numeric comparison +function didn't handle large integers that weren't exactly +representable by a double. This now uses the same code used to +implement the \f(CW\*(C`<=>\*(C'\fR operator. +[GH #15768] <https://github.com/Perl/perl5/issues/15768> +.IP \(bu 4 +Fix issues with \f(CW\*(C`/(?{ ... <<EOF })/\*(C'\fR that broke +Method::Signatures. +[GH #15779] <https://github.com/Perl/perl5/issues/15779> +.IP \(bu 4 +Fixed an assertion failure with \f(CW\*(C`chop\*(C'\fR and \f(CW\*(C`chomp\*(C'\fR, which +could be triggered by \f(CW\*(C`chop(@x =~ tr/1/1/)\*(C'\fR. +[GH #15738] <https://github.com/Perl/perl5/issues/15738>. +.IP \(bu 4 +Fixed a comment skipping error in patterns under \f(CW\*(C`/x\*(C'\fR; it could stop +skipping a byte early, which could be in the middle of a UTF\-8 +character. +[GH #15790] <https://github.com/Perl/perl5/issues/15790>. +.IP \(bu 4 +\&\fIperldb\fR now ignores \fI/dev/tty\fR on non-Unix systems. +[GH #12244] <https://github.com/Perl/perl5/issues/12244>; +.IP \(bu 4 +Fix assertion failure for \f(CW\*(C`{}\->$x\*(C'\fR when \f(CW$x\fR isn't defined. +[GH #15791] <https://github.com/Perl/perl5/issues/15791>. +.IP \(bu 4 +Fix an assertion error which could be triggered when a lookahead string +in patterns exceeded a minimum length. +[GH #15796] <https://github.com/Perl/perl5/issues/15796>. +.IP \(bu 4 +Only warn once per literal number about a misplaced \f(CW"_"\fR. +[GH #9989] <https://github.com/Perl/perl5/issues/9989>. +.IP \(bu 4 +The \f(CW\*(C`tr///\*(C'\fR parse code could be looking at uninitialized data after a +perse error. +[GH #15624] <https://github.com/Perl/perl5/issues/15624>. +.IP \(bu 4 +In a pattern match, a back-reference (\f(CW\*(C`\e1\*(C'\fR) to an unmatched capture could +read back beyond the start of the string being matched. +[GH #15634] <https://github.com/Perl/perl5/issues/15634>. +.IP \(bu 4 +\&\f(CW\*(C`use re \*(Aqstrict\*(Aq\*(C'\fR is supposed to warn if you use a range (such as +\&\f(CW\*(C`/(?[ [ X\-Y ] ])/\*(C'\fR) whose start and end digit aren't from the same group +of 10. It didn't do that for five groups of mathematical digits starting +at \f(CW\*(C`U+1D7E\*(C'\fR. +.IP \(bu 4 +A sub containing a "forward" declaration with the same name (\fIe.g.\fR, +\&\f(CW\*(C`sub c { sub c; }\*(C'\fR) could sometimes crash or loop infinitely. +[GH #15557] <https://github.com/Perl/perl5/issues/15557> +.IP \(bu 4 +A crash in executing a regex with a non-anchored UTF\-8 substring against a +target string that also used UTF\-8 has been fixed. +[GH #15628] <https://github.com/Perl/perl5/issues/15628> +.IP \(bu 4 +Previously, a shebang line like \f(CW\*(C`#!perl \-i u\*(C'\fR could be erroneously +interpreted as requesting the \f(CW\*(C`\-u\*(C'\fR option. This has been fixed. +[GH #15623] <https://github.com/Perl/perl5/issues/15623> +.IP \(bu 4 +The regex engine was previously producing incorrect results in some rare +situations when backtracking past an alternation that matches only one +thing; this +showed up as capture buffers (\f(CW$1\fR, \f(CW$2\fR, \fIetc.\fR) erroneously containing data +from regex execution paths that weren't actually executed for the final +match. +[GH #15666] <https://github.com/Perl/perl5/issues/15666> +.IP \(bu 4 +Certain regexes making use of the experimental \f(CW\*(C`regex_sets\*(C'\fR feature could +trigger an assertion failure. This has been fixed. +[GH #15620] <https://github.com/Perl/perl5/issues/15620> +.IP \(bu 4 +Invalid assignments to a reference constructor (\fIe.g.\fR, \f(CW\*(C`\eeval=time\*(C'\fR) could +sometimes crash in addition to giving a syntax error. +[GH #14815] <https://github.com/Perl/perl5/issues/14815> +.IP \(bu 4 +The parser could sometimes crash if a bareword came after \f(CW\*(C`evalbytes\*(C'\fR. +[GH #15586] <https://github.com/Perl/perl5/issues/15586> +.IP \(bu 4 +Autoloading via a method call would warn erroneously ("Use of inherited +AUTOLOAD for non-method") if there was a stub present in the package into +which the invocant had been blessed. The warning is no longer emitted in +such circumstances. +[GH #9094] <https://github.com/Perl/perl5/issues/9094> +.IP \(bu 4 +The use of \f(CW\*(C`splice\*(C'\fR on arrays with non-existent elements could cause other +operators to crash. +[GH #15577] <https://github.com/Perl/perl5/issues/15577> +.IP \(bu 4 +A possible buffer overrun when a pattern contains a fixed utf8 substring. +[GH #15534] <https://github.com/Perl/perl5/issues/15534> +.IP \(bu 4 +Fixed two possible use-after-free bugs in perl's lexer. +[GH #15549] <https://github.com/Perl/perl5/issues/15549> +.IP \(bu 4 +Fixed a crash with \f(CW\*(C`s///l\*(C'\fR where it thought it was dealing with UTF\-8 +when it wasn't. +[GH #15543] <https://github.com/Perl/perl5/issues/15543> +.IP \(bu 4 +Fixed a place where the regex parser was not setting the syntax error +correctly on a syntactically incorrect pattern. +[GH #15565] <https://github.com/Perl/perl5/issues/15565> +.IP \(bu 4 +The \f(CW\*(C`&.\*(C'\fR operator (and the \f(CW"&"\fR operator, when it treats its arguments as +strings) were failing to append a trailing null byte if at least one string +was marked as utf8 internally. Many code paths (system calls, regexp +compilation) still expect there to be a null byte in the string buffer +just past the end of the logical string. An assertion failure was the +result. +[GH #15606] <https://github.com/Perl/perl5/issues/15606> +.IP \(bu 4 +Avoid a heap-after-use error in the parser when creating an error messge +for a syntactically invalid heredoc. +[GH #15527] <https://github.com/Perl/perl5/issues/15527> +.IP \(bu 4 +Fix a segfault when run with \f(CW\*(C`\-DC\*(C'\fR options on DEBUGGING builds. +[GH #15563] <https://github.com/Perl/perl5/issues/15563> +.IP \(bu 4 +Fixed the parser error handling in subroutine attributes for an +\&'\f(CW\*(C`:attr(foo\*(C'\fR' that does not have an ending '\f(CW")"\fR'. +.IP \(bu 4 +Fix the perl lexer to correctly handle a backslash as the last char in +quoted-string context. This actually fixed two bugs, +[GH #15546] <https://github.com/Perl/perl5/issues/15546> and +[GH #15582] <https://github.com/Perl/perl5/issues/15582>. +.IP \(bu 4 +In the API function \f(CW\*(C`gv_fetchmethod_pvn_flags\*(C'\fR, rework separator parsing +to prevent possible string overrun with an invalid \f(CW\*(C`len\*(C'\fR argument. +[GH #15598] <https://github.com/Perl/perl5/issues/15598> +.IP \(bu 4 +Problems with in-place array sorts: code like \f(CW\*(C`@a = sort { ... } @a\*(C'\fR, +where the source and destination of the sort are the same plain array, are +optimised to do less copying around. Two side-effects of this optimisation +were that the contents of \f(CW@a\fR as seen by sort routines were +partially sorted; and under some circumstances accessing \f(CW@a\fR during the +sort could crash the interpreter. Both these issues have been fixed, and +Sort functions see the original value of \f(CW@a\fR. +[GH #15387] <https://github.com/Perl/perl5/issues/15387> +.IP \(bu 4 +Non-ASCII string delimiters are now reported correctly in error messages +for unterminated strings. +[GH #15469] <https://github.com/Perl/perl5/issues/15469> +.IP \(bu 4 +\&\f(CW\*(C`pack("p", ...)\*(C'\fR used to emit its warning ("Attempt to pack pointer to +temporary value") erroneously in some cases, but has been fixed. +.IP \(bu 4 +\&\f(CW@DB::args\fR is now exempt from "used once" warnings. The warnings only +occurred under \fB\-w\fR, because \fIwarnings.pm\fR itself uses \f(CW@DB::args\fR +multiple times. +.IP \(bu 4 +The use of built-in arrays or hash slices in a double-quoted string no +longer issues a warning ("Possible unintended interpolation...") if the +variable has not been mentioned before. This affected code like +\&\f(CW\*(C`qq|@DB::args|\*(C'\fR and \f(CW\*(C`qq|@SIG{\*(AqCHLD\*(Aq, \*(AqHUP\*(Aq}|\*(C'\fR. (The special variables +\&\f(CW\*(C`@\-\*(C'\fR and \f(CW\*(C`@+\*(C'\fR were already exempt from the warning.) +.IP \(bu 4 +\&\f(CW\*(C`gethostent\*(C'\fR and similar functions now perform a null check internally, to +avoid crashing with the torsocks library. This was a regression from v5.22. +[GH #15478] <https://github.com/Perl/perl5/issues/15478> +.IP \(bu 4 +\&\f(CW\*(C`defined *{\*(Aq!\*(Aq}\*(C'\fR, \f(CW\*(C`defined *{\*(Aq[\*(Aq}\*(C'\fR, and \f(CW\*(C`defined *{\*(Aq\-\*(Aq}\*(C'\fR no longer leak +memory if the typeglob in question has never been accessed before. +.IP \(bu 4 +Mentioning the same constant twice in a row (which is a syntax error) no +longer fails an assertion under debugging builds. This was a regression +from v5.20. +[GH #15017] <https://github.com/Perl/perl5/issues/15017> +.IP \(bu 4 +Many issues relating to \f(CW\*(C`printf "%a"\*(C'\fR of hexadecimal floating point +were fixed. In addition, the "subnormals" (formerly known as "denormals") +floating point numbers are now supported both with the plain IEEE 754 +floating point numbers (64\-bit or 128\-bit) and the x86 80\-bit +"extended precision". Note that subnormal hexadecimal floating +point literals will give a warning about "exponent underflow". +[GH #15495] <https://github.com/Perl/perl5/issues/15495> +[GH #15503] <https://github.com/Perl/perl5/issues/15503> +[GH #15504] <https://github.com/Perl/perl5/issues/15504> +[GH #15505] <https://github.com/Perl/perl5/issues/15505> +[GH #15510] <https://github.com/Perl/perl5/issues/15510> +[GH #15512] <https://github.com/Perl/perl5/issues/15512> +.IP \(bu 4 +A regression in v5.24 with \f(CW\*(C`tr/\eN{U+...}/foo/\*(C'\fR when the code point was between +128 and 255 has been fixed. +[GH #15475] <https://github.com/Perl/perl5/issues/15475>. +.IP \(bu 4 +Use of a string delimiter whose code point is above 2**31 now works +correctly on platforms that allow this. Previously, certain characters, +due to truncation, would be confused with other delimiter characters +with special meaning (such as \f(CW"?"\fR in \f(CW\*(C`m?...?\*(C'\fR), resulting +in inconsistent behaviour. Note that this is non-portable, +and is based on Perl's extension to UTF\-8, and is probably not +displayable nor enterable by any editor. +[GH #15477] <https://github.com/Perl/perl5/issues/15477> +.IP \(bu 4 +\&\f(CW\*(C`@{x\*(C'\fR followed by a newline where \f(CW"x"\fR represents a control or non-ASCII +character no longer produces a garbled syntax error message or a crash. +[GH #15518] <https://github.com/Perl/perl5/issues/15518> +.IP \(bu 4 +An assertion failure with \f(CW\*(C`%: = 0\*(C'\fR has been fixed. +[GH #15358] <https://github.com/Perl/perl5/issues/15358> +.IP \(bu 4 +In Perl 5.18, the parsing of \f(CW"$foo::$bar"\fR was accidentally changed, such +that it would be treated as \f(CW\*(C`$foo."::".$bar\*(C'\fR. The previous behavior, which +was to parse it as \f(CW\*(C`$foo:: . $bar\*(C'\fR, has been restored. +[GH #15408] <https://github.com/Perl/perl5/issues/15408> +.IP \(bu 4 +Since Perl 5.20, line numbers have been off by one when perl is invoked with +the \fB\-x\fR switch. This has been fixed. +[GH #15413] <https://github.com/Perl/perl5/issues/15413> +.IP \(bu 4 +Vivifying a subroutine stub in a deleted stash (\fIe.g.\fR, +\&\f(CW\*(C`delete $My::{"Foo::"}; \e&My::Foo::foo\*(C'\fR) no longer crashes. It had begun +crashing in Perl 5.18. +[GH #15420] <https://github.com/Perl/perl5/issues/15420> +.IP \(bu 4 +Some obscure cases of subroutines and file handles being freed at the same time +could result in crashes, but have been fixed. The crash was introduced in Perl +5.22. +[GH #15435] <https://github.com/Perl/perl5/issues/15435> +.IP \(bu 4 +Code that looks for a variable name associated with an uninitialized value +could cause an assertion failure in cases where magic is involved, such as +\&\f(CW\*(C`$ISA[0][0]\*(C'\fR. This has now been fixed. +[GH #15364] <https://github.com/Perl/perl5/issues/15364> +.IP \(bu 4 +A crash caused by code generating the warning "Subroutine STASH::NAME +redefined" in cases such as \f(CW\*(C`sub P::f{} undef *P::; *P::f =sub{};\*(C'\fR has been +fixed. In these cases, where the STASH is missing, the warning will now appear +as "Subroutine NAME redefined". +[GH #15368] <https://github.com/Perl/perl5/issues/15368> +.IP \(bu 4 +Fixed an assertion triggered by some code that handles deprecated behavior in +formats, \fIe.g.\fR, in cases like this: +.Sp +.Vb 3 +\& format STDOUT = +\& @ +\& 0"$x" +.Ve +.Sp +[GH #15366] <https://github.com/Perl/perl5/issues/15366> +.IP \(bu 4 +A possible divide by zero in string transformation code on Windows has been +avoided, fixing a crash when collating an empty string. +[GH #15439] <https://github.com/Perl/perl5/issues/15439> +.IP \(bu 4 +Some regular expression parsing glitches could lead to assertion failures with +regular expressions such as \f(CW\*(C`/(?<=/\*(C'\fR and \f(CW\*(C`/(?<!/\*(C'\fR. This has now been fixed. +[GH #15332] <https://github.com/Perl/perl5/issues/15332> +.IP \(bu 4 +\&\f(CW\*(C` until ($x = 1) { ... } \*(C'\fR and \f(CW\*(C` ... until $x = 1 \*(C'\fR now properly +warn when syntax warnings are enabled. +[GH #15138] <https://github.com/Perl/perl5/issues/15138> +.IP \(bu 4 +\&\fBsocket()\fR now leaves the error code returned by the system in \f(CW$!\fR on +failure. +[GH #15383] <https://github.com/Perl/perl5/issues/15383> +.IP \(bu 4 +Assignment variants of any bitwise ops under the \f(CW\*(C`bitwise\*(C'\fR feature would +crash if the left-hand side was an array or hash. +[GH #15346] <https://github.com/Perl/perl5/issues/15346> +.IP \(bu 4 +\&\f(CW\*(C`require\*(C'\fR followed by a single colon (as in \f(CW\*(C`foo() ? require : ...\*(C'\fR is +now parsed correctly as \f(CW\*(C`require\*(C'\fR with implicit \f(CW$_\fR, rather than +\&\f(CW\*(C`require ""\*(C'\fR. +[GH #15380] <https://github.com/Perl/perl5/issues/15380> +.IP \(bu 4 +Scalar \f(CW\*(C`keys %hash\*(C'\fR can now be assigned to consistently in all scalar +lvalue contexts. Previously it worked for some contexts but not others. +.IP \(bu 4 +List assignment to \f(CW\*(C`vec\*(C'\fR or \f(CW\*(C`substr\*(C'\fR with an array or hash for its first +argument used to result in crashes or "Can't coerce" error messages at run +time, unlike scalar assignment, which would give an error at compile time. +List assignment now gives a compile-time error, too. +[GH #15370] <https://github.com/Perl/perl5/issues/15370> +.IP \(bu 4 +Expressions containing an \f(CW\*(C`&&\*(C'\fR or \f(CW\*(C`||\*(C'\fR operator (or their synonyms \f(CW\*(C`and\*(C'\fR +and \f(CW\*(C`or\*(C'\fR) were being compiled incorrectly in some cases. If the left-hand +side consisted of either a negated bareword constant or a negated \f(CW\*(C`do {}\*(C'\fR +block containing a constant expression, and the right-hand side consisted of +a negated non-foldable expression, one of the negations was effectively +ignored. The same was true of \f(CW\*(C`if\*(C'\fR and \f(CW\*(C`unless\*(C'\fR statement modifiers, +though with the left-hand and right-hand sides swapped. This long-standing +bug has now been fixed. +[GH #15285] <https://github.com/Perl/perl5/issues/15285> +.IP \(bu 4 +\&\f(CW\*(C`reset\*(C'\fR with an argument no longer crashes when encountering stash entries +other than globs. +[GH #15314] <https://github.com/Perl/perl5/issues/15314> +.IP \(bu 4 +Assignment of hashes to, and deletion of, typeglobs named \f(CW*::::::\fR no +longer causes crashes. +[GH #15307] <https://github.com/Perl/perl5/issues/15307> +.IP \(bu 4 +Perl wasn't correctly handling true/false values in the LHS of a list +assign; specifically the truth values returned by boolean operators. +This could trigger an assertion failure in something like the following: +.Sp +.Vb 3 +\& for ($x > $y) { +\& ($_, ...) = (...); # here $_ is aliased to a truth value +\& } +.Ve +.Sp +This was a regression from v5.24. +[GH #15690] <https://github.com/Perl/perl5/issues/15690> +.IP \(bu 4 +Assertion failure with user-defined Unicode-like properties. +[GH #15696] <https://github.com/Perl/perl5/issues/15696> +.IP \(bu 4 +Fix error message for unclosed \f(CW\*(C`\eN{\*(C'\fR in a regex. An unclosed \f(CW\*(C`\eN{\*(C'\fR +could give the wrong error message: +\&\f(CW"\eN{NAME} must be resolved by the lexer"\fR. +.IP \(bu 4 +List assignment in list context where the LHS contained aggregates and +where there were not enough RHS elements, used to skip scalar lvalues. +Previously, \f(CW\*(C`(($a,$b,@c,$d) = (1))\*(C'\fR in list context returned \f(CW\*(C`($a)\*(C'\fR; now +it returns \f(CW\*(C`($a,$b,$d)\*(C'\fR. \f(CW\*(C`(($a,$b,$c) = (1))\*(C'\fR is unchanged: it still +returns \f(CW\*(C`($a,$b,$c)\*(C'\fR. This can be seen in the following: +.Sp +.Vb 2 +\& sub inc { $_++ for @_ } +\& inc(($a,$b,@c,$d) = (10)) +.Ve +.Sp +Formerly, the values of \f(CW\*(C`($a,$b,$d)\*(C'\fR would be left as \f(CW\*(C`(11,undef,undef)\*(C'\fR; +now they are \f(CW\*(C`(11,1,1)\*(C'\fR. +.IP \(bu 4 +Code like this: \f(CW\*(C`/(?{ s!!! })/\*(C'\fR could trigger infinite recursion on the C +stack (not the normal perl stack) when the last successful pattern in +scope is itself. We avoid the segfault by simply forbidding the use of +the empty pattern when it would resolve to the currently executing +pattern. +[GH #15669] <https://github.com/Perl/perl5/issues/15669> +.IP \(bu 4 +Avoid reading beyond the end of the line buffer in perl's lexer when +there's a short UTF\-8 character at the end. +[GH #15531] <https://github.com/Perl/perl5/issues/15531> +.IP \(bu 4 +Alternations in regular expressions were sometimes failing to match +a utf8 string against a utf8 alternate. +[GH #15680] <https://github.com/Perl/perl5/issues/15680> +.IP \(bu 4 +Make \f(CW\*(C`do "a\e0b"\*(C'\fR fail silently (and return \f(CW\*(C`undef\*(C'\fR and set \f(CW$!\fR) +instead of throwing an error. +[GH #15676] <https://github.com/Perl/perl5/issues/15676> +.IP \(bu 4 +\&\f(CW\*(C`chdir\*(C'\fR with no argument didn't ensure that there was stack space +available for returning its result. +[GH #15569] <https://github.com/Perl/perl5/issues/15569> +.IP \(bu 4 +All error messages related to \f(CW\*(C`do\*(C'\fR now refer to \f(CW\*(C`do\*(C'\fR; some formerly +claimed to be from \f(CW\*(C`require\*(C'\fR instead. +.IP \(bu 4 +Executing \f(CW\*(C`undef $x\*(C'\fR where \f(CW$x\fR is tied or magical no longer incorrectly +blames the variable for an uninitialized-value warning encountered by the +tied/magical code. +.IP \(bu 4 +Code like \f(CW\*(C`$x = $x . "a"\*(C'\fR was incorrectly failing to yield a +use of uninitialized value +warning when \f(CW$x\fR was a lexical variable with an undefined value. That has +now been fixed. +[GH #15269] <https://github.com/Perl/perl5/issues/15269> +.IP \(bu 4 +\&\f(CW\*(C`undef *_; shift\*(C'\fR or \f(CW\*(C`undef *_; pop\*(C'\fR inside a subroutine, with no +argument to \f(CW\*(C`shift\*(C'\fR or \f(CW\*(C`pop\*(C'\fR, began crashing in Perl 5.14, but has now +been fixed. +.IP \(bu 4 +\&\f(CW"string$scalar\->$*"\fR now correctly prefers concatenation +overloading to string overloading if \f(CW\*(C`$scalar\->$*\*(C'\fR returns an +overloaded object, bringing it into consistency with \f(CW$$scalar\fR. +.IP \(bu 4 +\&\f(CW\*(C`/@0{0*\->@*/*0\*(C'\fR and similar contortions used to crash, but no longer +do, but merely produce a syntax error. +[GH #15333] <https://github.com/Perl/perl5/issues/15333> +.IP \(bu 4 +\&\f(CW\*(C`do\*(C'\fR or \f(CW\*(C`require\*(C'\fR with an argument which is a reference or typeglob +which, when stringified, +contains a null character, started crashing in Perl 5.20, but has now been +fixed. +[GH #15337] <https://github.com/Perl/perl5/issues/15337> +.IP \(bu 4 +Improve the error message for a missing \f(CWtie()\fR package/method. This +brings the error messages in line with the ones used for normal method +calls. +.IP \(bu 4 +Parsing bad POSIX charclasses no longer leaks memory. +[GH #15382] <https://github.com/Perl/perl5/issues/15382> +.SH "Known Problems" +.IX Header "Known Problems" +.IP \(bu 4 +G++ 6 handles subnormal (denormal) floating point values differently +than gcc 6 or g++ 5 resulting in "flush-to-zero". The end result is +that if you specify very small values using the hexadecimal floating +point format, like \f(CW\*(C`0x1.fffffffffffffp\-1022\*(C'\fR, they become zeros. +[GH #15990] <https://github.com/Perl/perl5/issues/15990> +.SH "Errata From Previous Releases" +.IX Header "Errata From Previous Releases" +.IP \(bu 4 +Fixed issues with recursive regexes. The behavior was fixed in Perl 5.24. +[GH #14935] <https://github.com/Perl/perl5/issues/14935> +.SH Obituary +.IX Header "Obituary" +Jon Portnoy (AVENJ), a prolific Perl author and admired Gentoo community +member, has passed away on August 10, 2016. He will be remembered and +missed by all those who he came in contact with, and enriched with his +intellect, wit, and spirit. +.PP +It is with great sadness that we also note Kip Hampton's passing. Probably +best known as the author of the Perl & XML column on XML.com, he was a +core contributor to AxKit, an XML server platform that became an Apache +Foundation project. He was a frequent speaker in the early days at +OSCON, and most recently at YAPC::NA in Madison. He was frequently on +irc.perl.org as ubu, generally in the #axkit\-dahut community, the +group responsible for YAPC::NA Asheville in 2011. +.PP +Kip and his constant contributions to the community will be greatly +missed. +.SH Acknowledgements +.IX Header "Acknowledgements" +Perl 5.26.0 represents approximately 13 months of development since Perl 5.24.0 +and contains approximately 360,000 lines of changes across 2,600 files from 86 +authors. +.PP +Excluding auto-generated files, documentation and release tools, there were +approximately 230,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.26.0: +.PP +Aaron Crane, Abigail, Ævar Arnfjörð Bjarmason, Alex Vandiver, Andreas +König, Andreas Voegele, Andrew Fresh, Andy Lester, Aristotle Pagaltzis, Chad +Granum, Chase Whitener, Chris 'BinGOs' Williams, Chris Lamb, Christian Hansen, +Christian Millour, Colin Newell, Craig A. Berry, Dagfinn Ilmari Mannsåker, Dan +Collins, Daniel Dragan, Dave Cross, Dave Rolsky, David Golden, David H. +Gutteridge, David Mitchell, Dominic Hargreaves, Doug Bell, E. Choroba, Ed Avis, +Father Chrysostomos, François Perrad, Hauke D, H.Merijn Brand, Hugo van der +Sanden, Ivan Pozdeev, James E Keenan, James Raspass, Jarkko Hietaniemi, Jerry +D. Hedden, Jim Cromie, J. Nick Koston, John Lightsey, Karen Etheridge, Karl +Williamson, Leon Timmermans, Lukas Mai, Matthew Horsfall, Maxwell Carey, Misty +De Meo, Neil Bowers, Nicholas Clark, Nicolas R., Niko Tyni, Pali, Paul +Marquess, Peter Avalos, Petr Písař, Pino Toscano, Rafael Garcia-Suarez, Reini +Urban, Renee Baecker, Ricardo Signes, Richard Levitte, Rick Delaney, Salvador +Fandiño, Samuel Thibault, Sawyer X, Sébastien Aperghis-Tramoni, Sergey +Aleynikov, Shlomi Fish, Smylers, Stefan Seifert, Steffen Müller, Stevan +Little, Steve Hay, Steven Humphrey, Sullivan Beck, Theo Buehler, Thomas Sibley, +Todd Rinaldo, Tomasz Konojacki, Tony Cook, Unicode Consortium, Yaroslav Kuzmin, +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 \f(CW\*(C`perlbug@perl.org\*(C'\fR 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. |