++ed by:

173 PAUSE users
166 non-PAUSE users.

Tony Cook
and 1 contributors


perldelta - what is new for perl v5.19.9


This document describes differences between the 5.19.8 release and the 5.19.9 release.

If you are upgrading from an earlier release such as 5.19.7, first read perl5198delta, which describes differences between 5.19.7 and 5.19.8.

Core Enhancements

UTF-8 locales now supported better under use locale

A UTF-8 locale is one in which the character set is Unicode and the encoding is UTF-8. Now, the POSIX LC_CTYPE category operations under such a locale (within the scope of use locale), which include case changing (like lc(), "\U"), and character classification (\w, \D, qr/[[:punct:]]/ work just as if not under locale, except taint rules are followed. Prior to this, Perl only handled single-byte locales. This resolves [perl #56820].

use locale now compiles on systems without locale ability

Previously doing this caused the program to not compile. Within its scope the program behaves as if in the "C" locale. Thus programs written for platforms that support locales can run on locale-less platforms without change. Attempts to change the locale away from the "C" locale will, of course, fail.


On some operating systems Perl can be compiled in such a way that any attempt to modify string buffers shared by multiple SVs will crash. This way XS authors can test that their modules handle copy-on-write scalars correctly. See "Copy on Write" in perlguts for detail.

This feature was actually added in 5.19.8, but was unintentionally omitted from its delta document.

-DL runtime option now added for tracing locale setting

This is designed for Perl core developers to aid in field debugging bugs regarding locales.

Subroutine signatures

Declarative syntax to unwrap argument list into lexical variables. sub foo ($a,$b) {...} checks the number of arguments and puts the arguments into lexical variables. Signatures are not equivalent to the existing idiom of sub foo { my($a,$b) = @_; ... }. Signatures are only available by enabling a non-default feature, and generate warnings about being experimental. The syntactic clash with prototypes is managed by disabling the short prototype syntax when signatures are enabled.

See "Signatures" in perlsub for details.

More locale initialization fallback options

If there was an error with locales during Perl start-up, it immediately gave up and tried to use the "C" locale. Now it first tries using other locales given by the environment variables, as detailed in "ENVIRONMENT" in perllocale. For example, if LC_ALL and LANG are both set, and using the LC_ALL locale fails, Perl will now try the LANG locale, and only if that fails, will it fall back to "C". On Windows machines, Perl will try, ahead of using "C", the system default locale if all the locales given by environment variables fail.

Incompatible Changes

Tainting happens under more circumstances; now conforms to documentation

This affects regular expression matching and changing the case of a string (lc, "\U", etc.) within the scope of use locale. The result is now tainted based on the operation, no matter what the contents of the string were, as the documentation (perlsec, "SECURITY" in perllocale) indicates it should. Previously, for the case change operation, if the string contained no characters whose case change could be affected by the locale, the result would not be tainted. For example, the result of uc() on an empty string or one containing only above-Latin1 code points is now tainted, and wasn't before. This leads to more consistent tainting results. Regular expression patterns taint their non-binary results (like $&, $2) if and only if the pattern contains elements whose matching depends on the current (potentially tainted) locale. Like the case changing functions, the actual contents of the string being matched now do not matter, whereas formerly it did. For example, if the pattern contains a \w, the results will be tainted even if the match did not have to use that portion of the pattern to succeed or fail, because what a \w matches depends on locale. However, for example, a . in a pattern will not enable tainting, because the dot matches any single character, and what the current locale is doesn't change in any way what matches and what doesn't.

Quote-like escape changes

The character after \c in a double-quoted string ("..." or qq(...)) or regular expression must now be a printable character and may not be {.

A literal { after \B or \b is now fatal.

These were deprecated in perl v5.14.


  • Setting $/ to a reference to zero or a reference to a negative integer is now deprecated, and will behave exactly as though it was set to undef. If you want slurp behavior set $/ to undef explicitly.

  • Setting $/ to a reference to a non integer is now forbidden and will throw an error. Perl has never documented what would happen in this context and while it used to behave the same as setting $/ to the address of the references in future it may behave differently, so we have forbidden this usage.

  • Use of any of these functions in the POSIX module is now deprecated: isalnum, isalpha, iscntrl, isdigit, isgraph, islower, isprint, ispunct, isspace, isupper, and isxdigit. The functions are buggy and don't work on UTF-8 encoded strings. See their entries in POSIX for more information.

    A warning is raised on the first call to any of them from each place in the code that they are called. (Hence a repeated statement in a loop will raise just the one warning.)

Performance Enhancements

  • Code like:

      my $x; # or @x, %x
      my $y;

    is now optimized to:

      my ($x, $y);

    In combination with the padrange optimization, this means longer uninitialized my variable statements are also optimized, so:

      my $x; my @y; my %z;


      my ($x, @y, %z);

    [perl #121077]

Modules and Pragmata

Updated Modules and Pragmata

  • autodie has been upgraded from version 2.22 to 2.23.

    autodie no longer weakens strict by allowing undeclared variables with the same name as built-ins. [cpan #74246]

    use autodie qw( foo ! foo); now correctly insists that we have hints for foo.

  • B has been upgraded from version 1.47 to 1.48.

    Remove the obsolete DEREFed flag from B::Concise.

  • B::Deparse has been upgraded from version 1.24 to 1.25.

    It now knows how to handle whitespace in prototypes. Previously, it could loop infinitely. [perl #121050]

  • CGI has been upgraded from version 3.64 to 3.65.

  • Compress::Raw::Bzip2 has been upgraded from version 2.063 to 2.064.

    Handle non-PVs better. [cpan #91558]

  • Compress::Raw::Zlib has been upgraded from version 2.063 to 2.065.

    Handle non-PVs better. [cpan #91558]

    Z_OK instead of Z_BUF_ERROR. [cpan #92521]

    Resolve a C++ build failure in core. [cpan #92657]

  • Config::Perl::V has been upgraded from version 0.19 to 0.20.

    Synchronize with blead (bincompat options)

  • CPAN::Meta::YAML has been upgraded from version 0.010 to 0.011.

  • Devel::Peek has been upgraded from version 1.15 to 1.16.

    Devel::Peek::SvREFCNT() now ensures it has been passed a reference, as specified by its prototype.

  • diagnostics has been upgraded from version 1.33 to 1.34.

  • Digest::SHA has been upgraded from version 5.85 to 5.87.

    Improved the performance of hexadecimal output functions and simplified capture of intermediate SHA states, which can now be done via strings (see getstate()/putstate()).

  • DynaLoader has been upgraded from version 1.24 to 1.25.

    Android support.

  • English has been upgraded from version 1.08 to 1.09.

    Added $OLD_PERL_VERSION as an alias for $].

  • ExtUtils::CBuilder has been upgraded from version 0.280213 to 0.280216.

    Android support.

  • ExtUtils::Embed has been upgraded from version 1.31 to 1.32.

    Skip tests when cross-compiling and $Config{cc} isn't available.

  • ExtUtils::Install has been upgraded from version 1.61 to 1.62.

    Skip tests when cross-compiler and make isn't available.

  • ExtUtils::MakeMaker has been upgraded from version 6.86 to 6.88.

    Improved support for Android and other minor changes.

  • feature has been upgraded from version 1.34 to 1.35.

  • File::Fetch has been upgraded from version 0.46 to 0.48.

    Force curl to be IPv4 only during testing on NetBSD.

  • HTTP::Tiny has been upgraded from version 0.039 to 0.042.

    Added support for keep-alive connections.

    If IO::Socket::IP 0.25 or later is available, use that for transparent IPv4 or IPv6 support.

  • inc::latest has been upgraded from version 0.4204 to 0.4205.

    NOTE: inc::latest is deprecated and may be removed from a future version of Perl.

  • The IO-Compress module collection has been upgraded from version 2.063 to 2.064.

    Android support.

  • IO::Socket::IP, tentatively introduced in Perl 5.19.8, has been upgraded from 0.26 to 0.28.

  • IPC::Cmd has been upgraded from version 0.90 to 0.92.

  • The libnet module collection has been upgraded from version 1.24 to 1.25.

    The creation of Net::FTP dataconnections now honour the requested timeout, errors from Net::Cmd::response() are now handled in Net::FTP::pasv_wait() and a warning from Net::Domain::domainname() on Android is now stopped.

  • locale has been upgraded from version 1.02 to 1.03.

    Allow use locale; on systems without locales, such as Android.

  • Locale::Codes has been upgraded from version 3.28 to 3.29.

  • Module::Build has been upgraded from version 0.4204 to 0.4205.

    Fix license code regression for artistic license.

    Don't swallow ExtUtils::CBuilder loading errors.

    Handle testing on cross-compile builds.

    Protect against platforms without getpw{nam,uid}.

  • Module::CoreList has been upgraded from version 3.04 to 3.06.

  • Module::Load has been upgraded from version 0.28 to 0.30.

    Prevent uninitialized warnings during testing.

  • Module::Load::Conditional has been upgraded from version 0.60 to 0.62.

  • mro has been upgraded from version 1.14 to 1.15.

    Use HEKfARG() instead of creating and throwing away SVs.

  • Net::Ping has been upgraded from version 2.42 to 2.43.

    Handle getprotobyname() or getprotobynumber() not being available.

  • Parse::CPAN::Meta has been upgraded from version 1.4409 to 1.4413.

    Invalid UTF-8 encoding in YAML files are now replaced with "PERLQQ" quoting from the Encode module and without warnings.

    Removed legacy test modifications for testing with the perl core.

  • The PathTools module collection has been upgraded from version 3.45 to 3.46.

    Improved support for Android.

    File::Spec::Unix->tmpdir now consistently returns an absolute path, unless in taint mode. [perl #120593]

  • Pod::Escapes has been upgraded from version 1.04 to 1.06.

    Now strict and warning clean. Several minor documentation updates.

    e2charnum() no longer treats non-ASCII Unicode digits as suitable for an escape. [cpan #70246]

  • Pod::Parser has been upgraded from version 1.61 to 1.62.

  • POSIX has been upgraded from version 1.38_01 to 1.38_02.

    Deprecate use of isfoo() functions.

  • Scalar::Util has been upgraded from version 1.36 to 1.38.

    A backwards-compatibility issue with older perls has been fixed. [cpan #92363]

  • threads has been upgraded from version 1.91 to 1.92.

    Synchronization with CPAN release.

  • version has been upgraded from version 0.9907 to 0.9908.

  • warnings has been upgraded from version 1.21 to 1.22.

    use warnings "FATAL"; now implies "all", and similarly for use warnings "NONFATAL". [perl #120977]


Changes to Existing Documentation



  • New sections on Read-Only Values and Copy on Write have been added. They were actually added in 5.19.8 but accidentally omitted from its delta document.


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

New Warnings

Configuration and Compilation

  • The cross-compilation model has been renovated. There's several new options, and some backwards-incompatible changes:

    We now build binaries for miniperl and generate_uudmap to be used on the host, rather than running every miniperl call on the target; this means that, short of 'make test', we no longer need access to the target system once Configure is done. You can provide already-built binaries through the hostperl and hostgenerate options to Configure.

    Additionally, if targeting an EBCDIC platform from an ASCII host, or viceversa, you'll need to run Configure with -Uhostgenerate, to indicate that generate_uudmap should be run on the target.

    Finally, there's also a way of having Configure end early, right after building the host binaries, by cross-compiling without specifying a targethost.

    The incompatible changes include no longer using xconfig.h, xlib, or Cross.pm, so canned config files and Makefiles will have to be updated.

  • Related to the above, there is now a way of specifying the location of sh (or equivalent) on the target system: targetsh.

    For example, Android has its sh in /system/bin/sh, so if cross-compiling from a more normal Unixy system with sh in /bin/sh, "targetsh" would end up as /system/bin/sh, and "sh" as /bin/sh.

Platform Support

New Platforms


Perl can now be built for Android, either natively or through cross-compilation, for all three currently available architectures (ARM, MIPS, and x86), on a wide range of versions.

Platform-Specific Notes


Skip access checks on remotes in opendir(). [perl #121002]


Fixed a build error in cygwin.c on Cygwin 1.7.28.

Tests now handle the errors that occur when cygserver isn't running.

Internal Changes

Regexp Engine Changes That Affect The Pluggable Regex Engine Interface

Many flags that used to be exposed via regexp.h and used to populate the extflags member of struct regexp have been removed. These fields were technically private to Perl's own regexp engine and should not have been exposed there in the first place.

The affected flags are:


As well as the follow flag masks:


All have been renamed to PREGf_ equivalents and moved to regcomp.h.

The behavior previously achieved by setting one or more of the RXf_ANCH_ flags (via the RXf_ANCH mask) have now been replaced by a *single* flag bit in extflags:


pluggable regex engines which previously used to set these flags should now set this flag ALONE.

Selected Bug Fixes

  • Backticks ( `` or qx// ) combined with multiple threads on Win32 could result in output sent to stdout on one thread being captured by backticks of an external command in another thread.

    This could occur for pseudo-forked processes too, as Win32's pseudo-fork is implemented in terms of threads. [perl #77672]

  • open $fh, ">+", undef no longer leaks memory when TMPDIR is set but points to a directory a temporary file cannot be created in. [perl #120951]

  • $^R wasn't available outside of the regular expression that initialized it. [perl #121070]

  • Fixed a regular expression bug introduced in 5.19.5 where \S, \W etc could fail for above ASCII. [perl #121144]

  • A large set of fixes and refactoring for re_intuit_start() was merged, the highlights are:

    • Fixed a panic when compiling the regular expression /\x{100}[xy]\x{100}{2}/.

    • Fixed a performance regression when performing a global pattern match against a UTF-8 string. [perl #120692]

    • Fixed another performance issue where matching a regular expression like /ab.{1,2}x/ against a long UTF-8 string would unnecessarily calculate byte offsets for a large portion of the string. [perl #120692]

  • for ( $h{k} || '' ) no longer auto-vivifies $h{k}. [perl #120374]

  • On Windows machines, Perl now emulates the POSIX use of the environment for locale initialization. Previously, the environment was ignored. See "ENVIRONMENT" in perllocale.

  • Fixed a crash when destroying a self-referencing GLOB. [perl #121242]

  • Call set-magic when setting $DB::sub. [perl #121255]

  • Fixed an alignment error when compiling regular expressions when built with GCC on HP-UX 64-bit.

Known Problems

  • The lib/locale.t test may fail rarely.

Errata From Previous Releases


This pod file contains a statement saying that RXf_SPLIT (and its alias RXf_PMf_SPLIT) and RXf_SKIPWHITE were no longer used and #defined to 0. This was the case for a short period, but the change was reverted before Perl 5.18 was released. As such it was not true in Perl 5.18.x, and is also not true now. Both flags continue to be used. The incorrect entry has been removed from perl5180delta.pod in this release.


Perl 5.19.9 represents approximately 4 weeks of development since Perl 5.19.8 and contains approximately 47,000 lines of changes across 610 files from 32 authors.

Excluding auto-generated files, documentation and release tools, there were approximately 34,000 lines of changes to 420 .pm, .t, .c and .h files.

Perl continues to flourish into its third decade thanks to a vibrant community of users and developers. The following people are known to have contributed the improvements that became Perl 5.19.9:

Abigail, Alan Haggai Alavi, Brad Gilbert, Brian Fraser, Chris 'BinGOs' Williams, Craig A. Berry, Daniel Dragan, David Golden, David Mitchell, Father Chrysostomos, Gavin Shelley, H.Merijn Brand, Hauke D, James E Keenan, Jerry D. Hedden, Jess Robinson, John Peacock, Karl Williamson, Matthew Horsfall, Neil Williams, Peter Martini, Piotr Roszatycki, Rafael Garcia-Suarez, Reini Urban, Ricardo Signes, Steffen Müller, Steve Hay, Sullivan Beck, Tom Hukins, Tony Cook, Yves Orton, Zefram.

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 https://rt.perl.org/ . 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.