++ed by:

173 PAUSE users
161 non-PAUSE users.

Steve Hay
and 1 contributors


perldelta - what is new for perl v5.17.3


This document describes differences between the 5.17.2 release and the 5.17.3 release.

If you are upgrading from an earlier release such as 5.17.1, first read perl5172delta, which describes differences between 5.17.1 and 5.17.2.

Core Enhancements

Computed Labels

The loop controls next, last and redo, and the special dump operator, now allow arbitrary expressions to be used to compute labels at run time. Previously, any argument that was not a constant was treated as the empty string.

Incompatible Changes

$ENV{foo}=undef deletes value from environ, like delete $ENV{foo}

This facilitates use of local() with %ENV entries. In previous versions of Perl, undef was converted to the empty string.

Defined values stored in environment are forced to byte strings

A value stored in an environment variable has always been stringified. In this release, it is converted to be only a byte string. First, it is forced to be a only a string. Then if the string is utf8 and the equivalent of utf8::downgrade() works, that result is used; otherwise, the equivalent of utf8::encode() is used, and a warning is issued about wide characters ("Diagnostics").

given now aliases the global $_

Instead of assigning to an implicit lexical $_, given now makes the global $_ an alias for its argument, just like foreach. However, it still uses lexical $_ if there is lexical $_ in scope (again, just like foreach) [perl #114020].

Modules and Pragmata

Updated Modules and Pragmata

  • B has been upgraded from version 1.36 to 1.37. All CVf_* and GVf_* and more SV-related flag values are now provided as constants in the B:: namespace and available for export. The default export list has not changed.

  • B::Concise has been upgraded from version 0.91 to 0.92. The -nobanner option has been fixed, and formats can now be dumped. When passed a sub name to dump, it will check also to see whether it is the name of a format. If a sub and a format share the same name, it will dump both.

  • B::Debug has been upgraded from version 1.17 to 1.18. This adds support (experimentally) for B::PADLIST, which will be added in Perl 5.17.4.

  • B::Deparse has been upgraded from version 1.15 to 1.16. It now deparses loop controls with the correct precedence, and multiple statements in a format line are also now deparsed correctly.

  • CGI has been upgraded from version 3.59 to 3.60. Unrecognized HTML escape sequences are now handled better, problematic trailing newlines are no longer inserted after <form> tags by startform() or start_form(), and bogus "Insecure Dependency" warnings appearing with some versions of perl are now worked around.

  • Compress::Raw::Bzip2 has been upgraded from version 2.05201 to 2.055. The misuse of Perl's "magic" API has been fixed.

  • Compress::Raw::Zlib has been upgraded from version 2.05401 to 2.056. The misuse of Perl's "magic" API has been fixed.

  • Compress::Zlib has been upgraded from version 2.052 to 2.055. compress(), uncompress(), memGzip() and memGunzip() have been speeded up by making parameter validation more efficient.

  • Data::Dumper has been upgraded from version 2.135_06 to 2.135_07. It has been optimized to only build a seen-scalar hash as necessary, thereby speeding up serialization drastically.

  • Devel::Peek has been upgraded from version 1.08 to 1.09. The only change has been to the test script, to account for changes to some flags in perl's internals.

  • Encode has been upgraded from version 2.44 to 2.47. The Mac alias x-mac-ce has been added, and various bugs have been fixed in Encode::Unicode, Encode::UTF7 and Encode::GSM0338.

  • Module::Build has been upgraded from version 0.40 to 0.4003. A minor bug fix allows markup to be used around the leading "Name" in a POD "abstract" line, and some documentation improvements have been made.

  • Module::CoreList has been upgraded from version 2.69 to 2.71. Version information is now stored as a delta, which greatly reduces the size of the CoreList.pm file.

  • Module::Load::Conditional has been upgraded from version 0.50 to 0.54. Various enhancements include the new use of Module::Metadata.

  • Module::Metadata has been upgraded from version 1.000009 to 1.000011. The creation of a Module::Metadata object for a typical module file has been sped up by about 40%, and some spurious warnings about $VERSIONs have been suppressed.

  • Module::Pluggable has been upgraded from version 4.0 to 4.3. Amongst other changes, triggers are now allowed on events, which gives a powerful way to modify behaviour.

  • perlfaq has been upgraded from version 5.0150040 to 5.0150041. This contains a couple of minor corrections and lists one new editor.

  • Pod::Simple has been upgraded from version 3.20 to 3.23. Numerous improvements have been made, mostly to Pod::Simple::XHTML, which also has a compatibility change: the codes_in_verbatim option is now disabled by default. See cpan/Pod-Simple/ChangeLog for the full details.

  • re has been upgraded from version 0.21 to 0.22. Single character [class]es like /[s]/ or /[s]/i are now optimized as if they did not have the brackets, i.e. /s/ or /s/i.

  • Socket has been upgraded from version 2.002 to 2.004. Constants and functions required for IP multicast source group membership have been added.

  • Storable has been upgraded from version 2.37 to 2.38. It can now freeze and thaw vstrings correctly. This causes a slight incompatible change in the storage format, so the format version has increased to 2.9.

  • Sys::Syslog has been upgraded from version 0.29 to 0.31. This contains several bug fixes relating to getservbyname(), setlogsock()and log levels in syslog(), together with fixes for Windows, Haiku-OS and GNU/kFreeBSD. See cpan/Sys-Syslog/Changes for the full details.

  • Term::ReadLine has been upgraded from version 1.09 to 1.10. This fixes the use of the cpan and cpanp shells on Windows in the event that the current drive happens to contain a \dev\tty file.

  • Text::Tabs and Text::Wrap have been upgraded from version 2009.0305 to 2012.0818. Support for Unicode combining characters has been added to them both.

  • Time::Local has been upgraded from version 1.2000 to 1.2300. Seconds values greater than 59 but less than 60 no longer cause timegm() and timelocal() to croak.

  • Unicode::UCD has been upgraded from version 0.44 to 0.45. This has been modified slightly for reasons of perl internal use only.

  • Win32 has been upgraded from version 0.44 to 0.45. New APIs have been added for getting and setting the current code page.

  • Win32CORE has been upgraded from version 0.02 to 0.03. The use of PERL_NO_GET_CONTEXT here has resulted in smaller machine code.


Changes to Existing Documentation

perlfunc, perlop

  • Loop control verbs (dump, goto, next, last and redo) have always had the same precedence as assignment operators, but this was not documented until now.


  • A caveat has been added to the documentation for $_ warning against the use of lexical $_ [perl #114020].


The following additions or changes have been made to diagnostic output, including warnings and fatal error messages. For the complete list of diagnostic messages, see perldiag.

New Diagnostics

New Errors

  • Unterminated delimiter for here document

    This message now occurs when a here document label has an initial quotation mark but the final quotation mark is missing.

    This replaces a bogus and misleading error message about not finding the label itself [perl #114104].

  • panic: child pseudo-process was never scheduled

    This error is thrown when a child pseudo-process in the ithreads implementation on Windows was not scheduled within the time period allowed and therefore was not able to initialize properly [perl #88840].

New Warnings

  • Wide character in setenv

    Attempts to put wide characters into environment variables via %ENV now provoke this warning.

Configuration and Compilation

  • The pager detection in Configure has been improved to allow responses which specify options after the program name, e.g. /usr/bin/less -R, if the user accepts the default value. This helps perldoc when handling ANSI escapes [perl #72156].

Platform Support

Discontinued Platforms

UTS Global

Support code relating to UTS global has been removed. UTS was a mainframe version of System V created by Amdahl, subsequently sold to UTS Global. The port has not been touched since before Perl 5.8.0, and UTS Global is now defunct.

Platform-Specific Notes


A new makefile option, USE_64_BIT_INT, has been added to the Windows makefiles. Set this to "define" when building a 32-bit perl if you want it to use 64-bit integers.

Machine code size reductions, already made to the DLLs of XS modules in Perl 5.17.2, have now been extended to the perl DLL itself.

Building with VC++ 6.0 was inadvertently broken in Perl 5.17.2 but has now been fixed again.


The a2p build has been fixed for the HP C++ compiler on OpenVMS.

Selected Bug Fixes

  • \w now matches the code points U+200C (ZERO WIDTH NON-JOINER) and U+200D (ZERO WIDTH JOINER). \W no longer matches these. This change is because Unicode corrected their definition of what \w should match.

  • dump LABEL no longer leaks its label.

  • Constant folding no longer changes the behaviour of functions like stat() and truncate() that can take either filenames or handles. stat 1 ? foo : bar nows treats its argument as a file name (since it is an arbitrary expression), rather than the handle "foo".

  • truncate FOO, $len no longer falls back to treating "FOO" as a file name if the filehandle has been deleted. This was broken in Perl 5.16.0.

  • Subroutine redefinitions after sub-to-glob and glob-to-glob assignments no longer cause double frees or panic messages.

  • s/// now turns vstrings into plain strings when performing a substitution, even if the resulting string is the same (s/a/a/).

  • Prototype mismatch warnings no longer erroneously treat constant subs as having no prototype when they actually have "".

  • Constant subroutines and forward declarations no longer prevent prototype mismatch warnings from omitting the sub name.

  • undef on a subroutine now clears call checkers.

  • The ref operator started leaking memory on blessed objects in Perl 5.16.0. This has been fixed [perl #114340].

  • use no longer tries to parse its arguments as a statement, making use constant { () }; a syntax error [perl #114222].

  • On debugging builds, "uninitialized" warnings inside formats no longer cause assertion failures.

  • On debugging builds, subroutines nested inside formats no longer cause assertion failures [perl #78550].

  • Formats and use statements are now permitted inside formats.

  • print $x and sub { print $x }->() now always produce the same output. It was possible for the latter to refuse to close over $x if the variable was not active; e.g., if it was defined outside a currently-running named subroutine.

  • Similarly, print $x and print eval '$x' now produce the same output. This also allows "my $x if 0" variables to be seen in the debugger [perl #114018].

  • Formats called recursively no longer stomp on their own lexical variables, but each recursive call has its own set of lexicals.

  • Attempting to free an active format or the handle associated with it no longer results in a crash.

  • Format parsing no longer gets confused by braces, semicolons and low-precedence operators. It used to be possible to use braces as format delimiters (instead of = and .), but only sometimes. Semicolons and low-precedence operators in format argument lines no longer confuse the parser into ignoring the line's return value. In format argument lines, braces can now be used for anonymous hashes, instead of being treated always as do blocks.

  • Formats can now be nested inside code blocks in regular expressions and other quoted constructs (/(?{...})/ and qq/${...}/) [perl #114040].

  • Formats are no longer created after compilation errors.

  • Some format syntax errors started causing crashes in Perl 5.17.2, but have now been fixed.

  • Under debugging builds, the -DA command line option started crashing in Perl 5.16.0. It has been fixed [perl #114368].

  • Scope::Escape compatibility, which was broken in Perl 5.17.2, has been restored [perl #113872].

  • A potential deadlock scenario involving the premature termination of a pseudo- forked child in a Windows build with ithreads enabled has been fixed. This resolves the common problem of the t/op/fork.t test hanging on Windows [perl #88840].

  • The microperl build, broken since Perl 5.15.7, has now been restored.

  • The code which generates errors from require() could potentially read one or two bytes before the start of the filename for filenames less than three bytes long and ending /\.p?\z/. This has now been fixed. Note that it could never have happened with module names given to use() or require() anyway.

  • The handling of pathnames of modules given to require() has been made thread-safe on VMS.

  • The re_compile() API function, the entry point for perl's regex compiler, was accidentally changed in Perl 5.17.1 to operate on the current engine. This has now been restored to its former core-engine-specific state [perl #114302].

  • Perl 5.17.1 introduced a memory leak into the re-use of run-time regexes where the pattern hasn't changed (i.e. /$unchanging/). This has now been fixed.

  • A bug in the compilation of a /(?{})/ expression which affected the TryCatch test suite has been fixed [perl #114242].

  • Formats no longer leak. They started leaking in Perl 5.17.2.

  • Pod can now be nested in code inside a quoted construct outside of a string eval. This used to work only within string evals [perl #114040].


Perl 5.17.3 represents approximately 4 weeks of development since Perl 5.17.2 and contains approximately 85,000 lines of changes across 470 files from 24 authors.

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.17.3:

Andy Dougherty, Chip Salzenberg, Chris 'BinGOs' Williams, Craig A. Berry, Daniel Dragan, Dave Rolsky, David Leadbeater, David Mitchell, Eric Brine, Father Chrysostomos, Goro Fuji, James E Keenan, Jan Dubois, Joaquin Ferrero, Karl Williamson, Nicholas Clark, Paul Marquess, Reini Urban, Ricardo Signes, Robin Barker, Shirakata Kentaro, Steffen Müller, Steve Hay, Tony Cook.

The list above is almost certainly incomplete as it is automatically generated from version control history. In particular, it does not include the names of the (very much appreciated) contributors who reported issues to the Perl bug tracker.

Many of the changes included in this version originated in the CPAN modules included in Perl's core. We're grateful to the entire CPAN community for helping Perl to flourish.

For a more complete list of all of Perl's historical contributors, please see the AUTHORS file in the Perl source distribution.

Reporting Bugs

If you find what you think is a bug, you might check the articles recently posted to the comp.lang.perl.misc newsgroup and the perl bug database at http://rt.perl.org/perlbug/ . There may also be information at http://www.perl.org/ , the Perl Home Page.

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 perl -V, will be sent off to perlbug@perl.org to be analysed by the Perl porting team.

If the bug you are reporting has security implications, which make it inappropriate to send to a publicly archived mailing list, then please send it to perl5-security-report@perl.org. This points to a closed subscription unarchived mailing list, which includes all the core committers, who will be able to help assess the impact of issues, figure out a resolution, and help co-ordinate the release of patches to mitigate or fix the problem across all platforms on which Perl is supported. Please only use this address for security issues in the Perl core, not for modules independently distributed on CPAN.


The Changes file for an explanation of how to view exhaustive details on what changed.

The INSTALL file for how to build Perl.

The README file for general stuff.

The Artistic and Copying files for copyright information.