PERL5320DELTA(1)

✨ PERL5320DELTA πŸ’–

the tea on what's new for perl v5.32.0 β€” it lives in the Perl Programmers Reference Guide, bestie πŸŽ€


NAME πŸ’…

perl5320delta β€” what is new for perl v5.32.0 ✨


DESCRIPTION πŸ¦‹

okay so this whole doc is literally just the receipts on what changed between the 5.30.0 release and the 5.32.0 release. that's it, that's the vibe.

πŸ’– heads up bestie: if you're jumping up from an earlier release like 5.28.0, pls read perl5300delta FIRST β€” that one walks you through the differences between 5.28.0 and 5.30.0. don't skip it, i'm begging πŸ™ˆ

Core Enhancements πŸ‘‘

The isa Operator 🌸

okay SO. there's a brand new experimental infix operator called isa, and what it does is test whether a given object is an instance of a given class β€” or a class derived from it πŸ‘‘

if( $obj isa Package::Name ) { ... }

for more detail, go peek at "Class Instance Operator" in perlop. iykyk πŸ’œ

Unicode 13.0 is supported 🌈

yup, we're on Unicode 13.0 now. see <https://www.unicode.org/versions/Unicode13.0.0/> for the details ✨

Chained comparisons capability ⛓️

so some comparison operators, as their associativity, chain with some operators of the same precedence (but NEVER with operators of different precedence, got it?).

if ( $x < $y <= $z ) {...}

behaves exactly like:

if ( $x < $y && $y <= $z ) {...}

(assuming that $y is as simple a scalar as it looks πŸ‘€)

you can read more about this in perlop under "Operator Precedence and Associativity" in perlop πŸ’…

New Unicode properties Identifier_Status and Identifier_Type supported πŸ¦‹

Unicode revised its regular expression requirements β€” here's the link: <https://www.unicode.org/reports/tr18/tr18-21.html>. as part of that, they're wanting more properties to be exposed, ones that aren't part of the strict UCD (that's the Unicode character database, bestie). these two are used for examining inputs for security purposes. details on their usage live at <https://www.unicode.org/reports/tr39/> πŸŽ€

It is now possible to write qr/\p{Name=...}/, or qr!\p{na=/(SMILING|GRINNING) FACE/}! ✨

the Unicode Name property is now accessible in regular expression patterns, as an alternative to \N{...} πŸŽ‰ a comparison of the two methods is given in "Comparison of \N{...} and \p{name=...}" in perlunicode.

and the second example up there shows that wildcard subpatterns are also usable in this property. see "Wildcards in Property Values" in perlunicode πŸ’–

Improvement of POSIX::mblen(), mbtowc, and wctomb 🌸

the POSIX::mblen(), mbtowc, and wctomb functions now work on shift state locales and are thread-safe on C99 and above compilers when executed on a platform that has locale thread-safety 🫢 oh and the length parameters are now optional.

these functions are always executed under the current C language locale. (see perllocale.) most locales are stateless, but a few β€” notably the very rarely encountered ISO 2022 β€” maintain a state between calls to these functions. previously the state was cleared on every call, but now the state is not reset unless the appropriate parameter is undef πŸ‘€

on threaded perls, the C99 functions mbrlen(3), mbrtowc(3), and wcrtomb(3), when available, are substituted for the plain functions. this makes these functions thread-safe when executing on a locale thread-safe platform πŸ’…

the string length parameters in mblen and mbtowc are now optional; useful only if you wish to restrict the length parsed in the source string to less than the actual length 😌

Alpha assertions are no longer experimental πŸŽ‰

see "(*pla:pattern)" in perlre, "(*plb:pattern)" in perlre, "(*nla:pattern)" in perlre>, and "(*nlb:pattern)" in perlre. use of these no longer generates a warning; existing code that disables the warning category experimental::alpha_assertions will continue to work without any changes needed. enabling the category has no effect ✨

Script runs are no longer experimental πŸ”₯

see "Script Runs" in perlre. use of these no longer generates a warning; existing code that disables the warning category experimental::script_run will continue to work without any changes needed. enabling the category has no effect ✨

Feature checks are now faster ⚑

previously feature checks in the parser required a hash lookup when features were set outside of a feature bundle β€” this has been optimized to a bit mask check. ate and left no crumbs πŸ’… [GH #17229 <https://github.com/Perl/perl5/issues/17229>]

Perl is now developed on GitHub πŸ‘‘

Perl is now developed on GitHub. you can find us at <https://github.com/Perl/perl5> πŸŽ€

non-security bugs should now be reported via GitHub. security issues should continue to be reported as documented in perlsec πŸ”’

Compiled patterns can now be dumped before optimization 🧚

this is primarily useful for tracking down bugs in the regular expression compiler πŸ‘€ this dump happens on -DDEBUGGING perls, if you specify -Drv on the command line; or on any perl if the pattern is compiled within the scope of use re qw(Debug DUMP_PRE_OPTIMIZE) or use re qw(Debug COMPILE EXTRA). (all but the second case display other information as well.) πŸ’œ


Security πŸ”’

[CVE-2020-10543] Buffer overflow caused by a crafted regular expression πŸ’€

a signed size_t integer overflow in the storage space calculations for nested regular expression quantifiers could cause a heap buffer overflow in Perl's regular expression compiler that overwrites memory allocated after the regular expression storage space with attacker supplied data 😭

the target system needs a sufficient amount of memory to allocate partial expansions of the nested quantifiers prior to the overflow occurring. this requirement is unlikely to be met on 64-bit systems πŸ™

discovered by: ManhND of The Tarantula Team, VinCSS (a member of Vingroup) 🫢

[CVE-2020-10878] Integer overflow via malformed bytecode produced by a crafted regular expression πŸ’€

integer overflows in the calculation of offsets between instructions for the regular expression engine could cause corruption of the intermediate language state of a compiled regular expression 😭 an attacker could abuse this behaviour to insert instructions into the compiled form of a Perl regular expression 😬

discovered by: Hugo van der Sanden and Slaven Rezic 🫢

[CVE-2020-12723] Buffer overflow caused by a crafted regular expression πŸ’€

recursive calls to S_study_chunk() by Perl's regular expression compiler to optimize the intermediate language representation of a regular expression could cause corruption of the intermediate language state of a compiled regular expression 😭

discovered by: Sergey Aleynikov 🫢

Additional Note πŸ“

an application written in Perl would only be vulnerable to any of the above flaws if it evaluates regular expressions supplied by the attacker. evaluating regular expressions in this fashion is known to be dangerous since the regular expression engine does not protect against denial of service attacks in this usage scenario 🚨

Incompatible Changes πŸ™ˆ

Certain pattern matching features are now prohibited in compiling Unicode property value wildcard subpatterns 🚫

these few features are either inappropriate or interfere with the algorithm used to accomplish this task. the complete list is in "Wildcards in Property Values" in perlunicode πŸ’…

Unused functions POSIX::mbstowcs and POSIX::wcstombs are removed πŸ—‘οΈ

these functions could never have worked due to a defective interface specification 😭 there is clearly no demand for them, given that no one has ever complained in the many years the functions were claimed to be available β€” hence so-called "support" for them is now dropped πŸ’€

A bug fix for (?[...]) may have caused some patterns to no longer compile πŸ‘€

see "Selected Bug Fixes". the heuristics previously used may have let some constructs compile (perhaps not with the programmer's intended effect) that should have been errors. none are known, but it is possible that some erroneous constructs no longer compile 😬

\p{user-defined} properties now always override official Unicode ones πŸ‘‘

previously, if and only if a user-defined property was declared prior to the compilation of the regular expression pattern that contains it, its definition was used instead of any official Unicode property with the same name. now, it always overrides the official property 😀 this change could break existing code that relied (likely unwittingly) on the previous behavior. without this fix, if Unicode released a new version with a new property that happens to have the same name as the one you had long been using, your program would break when you upgraded to a perl that used that new Unicode version 😭 see "User-Defined Character Properties" in perlunicode. [GH #17205 <https://github.com/Perl/perl5/issues/17205>]

Modifiable variables are no longer permitted in constants 🚫

code like:

my $var;
$sub = sub () { $var };

where $var is referenced elsewhere in some sort of modifiable context now produces an exception when the sub is defined 😳

this error can be avoided by adding a return to the sub definition:

$sub = sub () { return $var };

this has been deprecated since Perl 5.22. [GH #17020 <https://github.com/Perl/perl5/issues/17020>]

Use of vec on strings with code points above 0xFF is forbidden 🚫

such strings are represented internally in UTF-8, and vec is a bit-oriented operation that will likely give unexpected results on those strings. this was deprecated in perl 5.28.0 😌

Use of code points over 0xFF in string bitwise operators 🚫

some uses of these were already illegal after a previous deprecation cycle. the remaining uses are now prohibited, having been deprecated in perl 5.28.0. see perldeprecation πŸ’…

Sys::Hostname::hostname() does not accept arguments 🚫

this usage was deprecated in perl 5.28.0 and is now fatal πŸ’€

Plain 0 string now treated as a number for range operator πŸ”’

previously a range "0" .. "-1" would produce a range of numeric strings from "0" through "99"; this now produces an empty list, just as 0 .. -1 does. this also means that "0" .. "9" now produces a list of integers, where previously it would produce a list of strings 😳

this was due to a special case that treated strings starting with "0" as strings so ranges like "00" .. "03" produced "00", "01", "02", "03", but didn't specially handle the string "0". [GH #16770 <https://github.com/Perl/perl5/issues/16770>]

\K now disallowed in look-ahead and look-behind assertions 🚫

this was disallowed because it causes unexpected behaviour, and no-one could define what the desired behaviour should be 😭 [GH #14638 <https://github.com/Perl/perl5/issues/14638>]


Performance Enhancements ⚑

  • my_strnlen has been sped up for systems that don't have their own strnlen implementation πŸ”₯
  • grok_bin_oct_hex (and so, grok_bin, grok_oct, and grok_hex) have been sped up ⚑
  • grok_number_flags has been sped up πŸ’¨
  • sort is now noticeably faster in cases such as sort {$a <=> $b} or sort {$b <=> $a} πŸ”₯ [GH #17608 <https://github.com/Perl/perl5/pull/17608>]

πŸ’– Modules and Pragmata πŸ’–

okay bestie, buckle UP, because this is the part where literally every single module in core got a little glow-up and we're gonna list them all. no skipping. i know it's long. we're doing it. 🫢

✨ Updated Modules and Pragmata ✨

  • Archive::Tar β€” glow-up from 2.32 to 2.36 ✨
  • autodie β€” glow-up from 2.29 to 2.32 ✨
  • B β€” glow-up from 1.76 to 1.80 ✨
  • B::Deparse β€” glow-up from 1.49 to 1.54 ✨
  • Benchmark β€” glow-up from 1.22 to 1.23 ✨
  • charnames β€” glow-up from 1.45 to 1.48 ✨
  • Class::Struct β€” glow-up from 0.65 to 0.66 ✨
  • Compress::Raw::Bzip2 β€” glow-up from 2.084 to 2.093 ✨
  • Compress::Raw::Zlib β€” glow-up from 2.084 to 2.093 ✨
  • CPAN β€” glow-up from 2.22 to 2.27 ✨
  • DB_File β€” glow-up from 1.843 to 1.853 ✨
  • Devel::PPPort β€” glow-up from 3.52 to 3.57 ✨

and the tea: the test files it generates on Win32 are now identical to the ones it generates on POSIX-like systems. same files, same vibe, no cap. πŸŽ€

  • diagnostics β€” glow-up from 1.36 to 1.37 ✨
  • Digest::MD5 β€” glow-up from 2.55 to 2.55_01 ✨
  • Dumpvalue β€” glow-up from 1.18 to 1.21 ✨

okay so before, when you were dumping array elements and hit an undefined value, it printed "empty array". which was lowkey a lie. now it prints what was apparently the original intention all along: "empty slot". we love a correction arc. πŸ’…

  • DynaLoader β€” glow-up from 1.45 to 1.47 ✨
  • Encode β€” glow-up from 3.01 to 3.06 ✨
  • encoding β€” glow-up from 2.22 to 3.00 ✨
  • English β€” glow-up from 1.10 to 1.11 ✨
  • Exporter β€” glow-up from 5.73 to 5.74 ✨
  • ExtUtils::CBuilder β€” glow-up from 0.280231 to 0.280234 ✨
  • ExtUtils::MakeMaker β€” glow-up from 7.34 to 7.44 ✨
  • feature β€” glow-up from 1.54 to 1.58 ✨

there's a brand new "indirect" feature in the building πŸ‘‘ it's enabled by default, but the whole point is that it lets you turn indirect object syntax off if you want to.

  • File::Find β€” glow-up from 1.36 to 1.37 ✨

on Win32, the tests no longer need a file chillin' in the drive root directory, and they don't need the root directory to be writable either. freedom, honestly. πŸ¦‹

  • File::Glob β€” glow-up from 1.32 to 1.33 ✨
  • File::stat β€” glow-up from 1.08 to 1.09 ✨
  • Filter::Simple β€” glow-up from 0.95 to 0.96 ✨
  • Getopt::Long β€” glow-up from 2.5 to 2.51 ✨
  • Hash::Util β€” glow-up from 0.22 to 0.23 ✨

the Synopsis got updated because the example code straight-up stopped working with newer perls 😭 the receipts are here: GH #17399 https://github.com/Perl/perl5/issues/17399

  • I18N::Langinfo β€” glow-up from 0.18 to 0.19 ✨
  • I18N::LangTags β€” glow-up from 0.43 to 0.44 ✨

now documents the "IGNORE_WIN32_LOCALE" environment variable. write that down bestie πŸ“

  • IO β€” glow-up from 1.40 to 1.43 ✨

IO::Socket no longer caches a zero protocol value, because a zero there actually means the implementation is gonna pick a protocol itself. the consequence? on platforms that don't implement "SO_PROTOCOL" for a given socket type, the protocol method may return "undef". iykyk πŸ’€

also, the TO you supply is now always honoured when you call the send() method. receipts: GH #16891 https://github.com/Perl/perl5/issues/16891

  • IO-Compress β€” glow-up from 2.084 to 2.093 ✨
  • IPC::Cmd β€” glow-up from 1.02 to 1.04 ✨
  • IPC::Open3 β€” glow-up from 1.20 to 1.21 ✨
  • JSON::PP β€” glow-up from 4.02 to 4.04 ✨
  • Math::BigInt β€” glow-up from 1.999816 to 1.999818 ✨
  • Math::BigInt::FastCalc β€” glow-up from 0.5008 to 0.5009 ✨
  • Module::CoreList β€” glow-up from 5.20190522 to 5.20200620 ✨
  • Module::Load::Conditional β€” glow-up from 0.68 to 0.70 ✨
  • Module::Metadata β€” glow-up from 1.000036 to 1.000037 ✨
  • mro β€” glow-up from 1.22 to 1.23 ✨
  • Net::Ping β€” glow-up from 2.71 to 2.72 ✨
  • Opcode β€” glow-up from 1.43 to 1.47 ✨
  • open β€” glow-up from 1.11 to 1.12 ✨
  • overload β€” glow-up from 1.30 to 1.31 ✨
  • parent β€” glow-up from 0.237 to 0.238 ✨
  • perlfaq β€” glow-up from 5.20190126 to 5.20200523 ✨
  • PerlIO β€” glow-up from 1.10 to 1.11 ✨
  • PerlIO::encoding β€” glow-up from 0.27 to 0.28 ✨
  • PerlIO::via β€” glow-up from 0.17 to 0.18 ✨
  • Pod::Html β€” glow-up from 1.24 to 1.25 ✨
  • Pod::Simple β€” glow-up from 3.35 to 3.40 ✨
  • podlators β€” glow-up from 4.11 to 4.14 ✨
  • POSIX β€” glow-up from 1.88 to 1.94 ✨
  • re β€” glow-up from 0.37 to 0.40 ✨
  • Safe β€” glow-up from 2.40 to 2.41 ✨
  • Scalar::Util β€” glow-up from 1.50 to 1.55 ✨
  • SelfLoader β€” glow-up from 1.25 to 1.26 ✨
  • Socket β€” glow-up from 2.027 to 2.029 ✨
  • Storable β€” glow-up from 3.15 to 3.21 ✨

three whole things here, stay with me:

1️⃣ using note() from Test::More in the tests is now optional. why does that matter? because it works around a circular dependency with Test::More when you're installing on very old perls from CPAN. messy history, we fixed it 🫢

2️⃣ vstring magic strings over 2GB are now disallowed. not allowed. no. periodt.

3️⃣ regular expression objects weren't being counted properly for object id purposes on retrieve, which would corrupt the resulting structure or throw a runtime error in some cases. receipts: GH #17037 https://github.com/Perl/perl5/issues/17037

  • Sys::Hostname β€” glow-up from 1.22 to 1.23 ✨
  • Sys::Syslog β€” glow-up from 0.35 to 0.36 ✨
  • Term::ANSIColor β€” glow-up from 4.06 to 5.01 ✨
  • Test::Simple β€” glow-up from 1.302162 to 1.302175 ✨
  • Thread β€” glow-up from 3.04 to 3.05 ✨
  • Thread::Queue β€” glow-up from 3.13 to 3.14 ✨
  • threads β€” glow-up from 2.22 to 2.25 ✨
  • threads::shared β€” glow-up from 1.60 to 1.61 ✨
  • Tie::File β€” glow-up from 1.02 to 1.06 ✨
  • Tie::Hash::NamedCapture β€” glow-up from 0.10 to 0.13 ✨
  • Tie::Scalar β€” glow-up from 1.04 to 1.05 ✨
  • Tie::StdHandle β€” glow-up from 4.5 to 4.6 ✨
  • Time::HiRes β€” glow-up from 1.9760 to 1.9764 ✨

obsolete code got the boot 🧹 say goodbye to support for pre-5.6 perl and classic MacOS. receipts: GH #17096 https://github.com/Perl/perl5/issues/17096

  • Time::Piece β€” glow-up from 1.33 to 1.3401 ✨
  • Unicode::Normalize β€” glow-up from 1.26 to 1.27 ✨
  • Unicode::UCD β€” glow-up from 0.72 to 0.75 ✨
  • VMS::Stdio β€” glow-up from 2.44 to 2.45 ✨
  • warnings β€” glow-up from 1.44 to 1.47 ✨
  • Win32 β€” glow-up from 0.52 to 0.53 ✨
  • Win32API::File β€” glow-up from 0.1203 to 0.1203_01 ✨
  • XS::APItest β€” glow-up from 1.00 to 1.09 ✨

πŸ₯€ Removed Modules and Pragmata πŸ₯€

  • Pod::Parser has been removed from the core distribution πŸ’€

but don't spiral, bestie β€” it's still available for download from CPAN. it's not gone gone, it just doesn't live here anymore. this resolves #13194 https://github.com/Perl/perl5/issues/13194

πŸ’– Documentation πŸ’–

ok so like, we tried SO hard to make the docs match reality, bestie. We updated them to reflect everything in this doc. If you spot one we missed?? pls open an issue at https://github.com/Perl/perl5/issues. no cap, we wanna know. 🫢

✨ Changes to Existing Documentation ✨

Also, these specific glow-ups happened:

πŸŽ€ perldebguts

  • Simplify a few regnode definitions β€” we updated the BOUND and NBOUND definitions. lil cleanup, v satisfying.
  • Add ANYOFHs regnode β€” this node is like ANYOFHb, except it's used when more than one leading byte is the same across all the matched code points.

ANYOFHb exists so we don't have to convert from UTF-8 to code point for something that literally won't match. It checks that the first byte in the UTF-8 encoded target is the one you want, which rules out basically most of the possible code points. efficiency icon fr πŸ’…

πŸŽ€ perlapi

  • sv_2pvbyte updated to mention it will croak if the SV cannot be downgraded. yes bestie it WILL throw hands.
  • sv_setpvn updated to mention that the UTF-8 flag will not be changed by this function, and a terminating NUL byte is guaranteed.
  • Documentation for PL_phase has been added. she finally got her own page πŸ’–
  • The documentation for grok_bin, grok_oct, and grok_hex has been updated and clarified.

πŸŽ€ perldiag

  • Add documentation for experimental 'isa' operator

(S experimental::isa) This warning is emitted if you use the ("isa") operator. This operator is currently experimental and its behaviour may change in future releases of Perl.

πŸŽ€ perlfunc

  • caller β€” like __FILE__ and __LINE__, the filename and line number returned here may be altered by the mechanism described at "Plain Old Comments (Not!)" in perlsyn.
  • __FILE__ β€” it can be altered by the mechanism described at "Plain Old Comments (Not!)" in perlsyn.
  • __LINE__ β€” it can be altered by the mechanism described at "Plain Old Comments (Not!)" in perlsyn.
  • return β€” now mentions that you cannot return from do BLOCK. nope. not allowed. πŸ™ˆ
  • open β€” the open() section had been renovated significantly. it's giving home makeover 🏠✨

πŸŽ€ perlguts

  • No longer suggesting using perl's malloc. Modern system malloc is assumed to be much better than perl's implementation now. respectfully, we're outsourcing that one.
  • Documentation about embed.fnc flags has been removed. embed.fnc now has sufficient comments within it. Anyone changing that file will see those comments first, so entries here are now redundant.
  • Updated documentation for UTF8f.
  • Added missing =for apidoc lines.

πŸŽ€ perlhacktips

  • The differences between Perl strings and C strings are now detailed. lowkey important, highkey underrated.

πŸŽ€ perlintro

πŸŽ€ perlipc

  • The documentation surrounding open and handle usage has been modernized to prefer 3-arg open and lexical variables instead of barewords. barewords, you're on notice. πŸ’€
  • Various updates and fixes including making all examples strict-safe and replacing -w with use warnings.

πŸŽ€ perlop

  • 'isa' operator is experimental

This is an experimental feature and is available when enabled by use feature 'isa'. It emits a warning in the experimental::isa category.

πŸŽ€ perlpod

  • Details of the various stacks within the perl interpreter are now explained here.
  • Advice has been added regarding the usage of Z<>.

πŸŽ€ perlport

πŸŽ€ perlreref

  • Fix some typos. tiny little typos. got 'em. 🧚

πŸŽ€ perlvar

  • Now recommends stringifying $] and comparing it numerically. stringify THEN compare, in that order, don't skip steps bestie.

πŸŽ€ perlapi, perlintern

  • Documentation has been added for several functions that were lacking it before. they were out here undocumented and unbothered, but not anymore.

πŸŽ€ perlxs

  • Suggest using libffi for simple library bindings via CPAN modules like FFI::Platypus or FFI::Raw.

πŸŽ€ POSIX

  • setlocale warning about threaded builds updated to note it does not apply on Perl 5.28.X and later.
  • Posix::SigSet->new(...) updated to state it throws an error if any of the supplied signals cannot be added to the set. so like, it WILL yell at you.

Additionally, the following selected changes have been made:

Where applicable, the URLs in the documentation have been moved from using the http:// protocol to https://. This also affects the location of the bug tracker at https://rt.perl.org.

  • Some links to OS/2 libraries, Address Sanitizer and other system tools had gone stale. These have been updated with working links.
  • Some links to old email addresses on perl5-porters had gone stale. These have been updated with working links.

🚨 Diagnostics 🚨

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

πŸ†• New Diagnostics

β›” New Errors

  • Expecting interpolated extended charclass in regex; marked by <-- HERE in m/%s/

This is a replacement for several error messages listed under "Changes to Existing Diagnostics".

  • "No digits found for %s literal"

(F) No hexadecimal digits were found following 0x or no binary digits were found following 0b.

⚠️ New Warnings

  • Code point 0x%X is not Unicode, and not portable

This is actually not a new message, but it is now output when the warnings category portable is enabled.

When raised during regular expression pattern compilation, the warning has extra text added at the end marking where precisely in the pattern it occurred. so it points at the exact spot, very helpful of it πŸ’…

  • Non-hex character '%c' terminates \x early. Resolved as "%s"

This replaces a warning that was much less specific, and which gave false information. This new warning parallels the similar already-existing one raised for "\o{}".

πŸ”„ Changes to Existing Diagnostics

  • Character following "\c" must be printable ASCII

...now has extra text added at the end, when raised during regular expression pattern compilation, marking where precisely in the pattern it occurred.

  • Use "%s" instead of "%s"

...now has extra text added at the end, when raised during regular expression pattern compilation, marking where precisely in the pattern it occurred.

  • Sequence "\c{" invalid

...now has extra text added at the end, when raised during regular expression pattern compilation, marking where precisely in the pattern it occurred.

  • "\c%c" is more clearly written simply as "%s"

...now has extra text added at the end, when raised during regular expression pattern compilation, marking where precisely in the pattern it occurred.

  • Non-octal character '%c' terminates \o early. Resolved as "%s"

...now includes the phrase "terminates \o early", and has extra text added at the end, when raised during regular expression pattern compilation, marking where precisely in the pattern it occurred. In some instances the text of the resolution has been clarified.

  • '%s' resolved to '\o{%s}%d'

As of Perl 5.32, this message is no longer generated. Instead, "Non-octal character '%c' terminates \o early. Resolved as "%s"" in perldiag is used instead.

  • Use of code point 0x%s is not allowed; the permissible max is 0x%X

Some instances of this message previously output the hex digits A, B, C, D, E, and F in lower case. Now they are all consistently upper case. consistency is the vibe ✨

  • The following three diagnostics have been removed, and replaced by "Expecting interpolated extended charclass in regex; marked by <-- HERE in m/%s/":
    • "Expecting close paren for nested extended charclass in regex; marked by <-- HERE in m/%s/"
    • "Expecting close paren for wrapper for nested extended charclass in regex; marked by <-- HERE in m/%s/"
    • "Expecting '(?flags:(?[...' in regex; marked by <-- HERE in m/%s/"
  • The "Code point 0x%X is not Unicode, and not portable" warning removed the line "Code points above 0xFFFF_FFFF require larger than a 32 bit word." as code points that large are no longer legal on 32-bit platforms.
  • Can't use global %s in %s

This error message has been slightly reformatted from the original "Can't use global %s in "%s"", and in particular misleading error messages like "Can't use global $_ in "my"" are now rendered as "Can't use global $_ in subroutine signature". way less confusing, we love to see it 🫢

  • Constants from lexical variables potentially modified elsewhere are no longer permitted

This error message replaces the former Constants from lexical variables potentially modified elsewhere are deprecated. This will not be allowed in Perl 5.32 to reflect the fact that this previously deprecated usage has now been transformed into an exception. The message's classification has also been updated from D (deprecated) to F (fatal). so yeah β€” that one used to be a "pls don't" and now it's a hard NO. 😭

See also "Incompatible Changes".

  • "\N{} here is restricted to one character" is now emitted in the same circumstances where previously "\N{} in inverted character class or as a range end-point is restricted to one character" was.

This is due to new circumstances having been added in Perl 5.30 that weren't covered by the earlier wording.


πŸ› οΈ Utility Changes πŸ› οΈ

πŸ› perlbug

  • The bug tracker homepage URL now points to GitHub.

πŸ—œοΈ streamzip

  • This is a new utility, included as part of an IO::Compress::Base upgrade.

streamzip creates a zip file from stdin. The program will read data from stdin, compress it into a zip container and, by default, write a streamed zip file to stdout. she's new here and she's already iconic πŸ‘‘

✨ Configuration and Compilation ✨

πŸ› οΈ Configure

  • For clang++, add "#include <stdlib.h>" to Configure's probes for "futimes", "strtoll", "strtoul", "strtoull", "strtouq" β€” otherwise those probes literally just fail to compile. embarrassing for them, not for us πŸ’…
  • Use a compile and run test for "lchown" to satisfy clang++, which should more reliably detect it.
  • For C++ compilers, add "#include <stdio.h>" to Configure's probes for "getpgrp" and "setpgrp" since they use printf and C++ compilers may straight up fail compilation instead of just throwing a little warning. rude but okay 🫢
  • Check if the compiler can handle the inline attribute.
  • Check for character data alignment.
  • Configure now correctly handles gcc-10. Before this it was reading it as gcc-1 and turning on "-fpcc-struct-return". bestie. the zero mattered 😭
  • Perl now no longer probes for "d_u32align", and defaults to "define" on all platforms instead. That check was error-prone when it was actually done, which was only on 32-bit platforms anyway. [GH #16680](https://github.com/Perl/perl5/issues/16680) https://github.com/Perl/perl5/issues/16680
  • The documentation and hints for building perl on Z/OS (native EBCDIC) have been updated. Still a work in progress, lowkey. 🌸
  • A new probe for "malloc_usable_size" has been added. ✨
  • Improvements in Configure for detection in C++ and clang++. Work ongoing by Andy Dougherty. [GH #17033](https://github.com/Perl/perl5/issues/17033) https://github.com/Perl/perl5/issues/17033
  • autodoc.pl

This tool, which regenerates perlintern and perlapi, has been overhauled significantly β€” it restores consistency in flags used in embed.fnc and Devel::PPPort, and it lets a whole bunch of redundant "=for apidoc" entries get removed from the code. iconic spring cleaning energy 🧹


πŸ§ͺ Testing

Tests were added and changed to reflect the other additions and changes in this release. And on top of that, these significant changes were made:

  • t/run/switches.t no longer uses (and re-uses) the tmpinplace/ directory under t/. This may prevent spurious failures. [GH #17424](https://github.com/Perl/perl5/issues/17424) https://github.com/Perl/perl5/issues/17424
  • Various bugs in "POSIX::mbtowc" were fixed. Potential races with other threads are now avoided, and previously the returned wide character could well be garbage. like, actual garbage. πŸ’€
  • Various bugs in "POSIX::wctomb" were fixed. Potential races with other threads are now avoided, and previously it would segfault if the string parameter was shared or hadn't been pre-allocated with a string long enough to hold the result. no cap, it would just die πŸ™ˆ
  • Certain test output of scalars containing control characters and Unicode has been fixed on EBCDIC.
  • t/charset_tools.pl: avoid some work on ASCII platforms.
  • t/re/regexp.t: speed up many regex tests on ASCII platforms.
  • t/re/pat.t: skip tests that don't work on EBCDIC.

🌍 Platform Support 🌍

πŸ’” Discontinued Platforms

Windows CE

Support for building perl on Windows CE has now been removed. gone, not forgotten πŸ•ŠοΈ


πŸ“ Platform-Specific Notes πŸ“

🐧 Linux

"cc" will be used to populate "plibpth" if "cc" is "clang". [GH #17043](https://github.com/Perl/perl5/issues/17043) https://github.com/Perl/perl5/issues/17043

πŸ¦‹ NetBSD 8.0

Fix compilation of Perl on NetBSD 8.0 with g++. [GH #17381](https://github.com/Perl/perl5/issues/17381) https://github.com/Perl/perl5/issues/17381

πŸͺŸ Windows

  • The configuration for "ccflags" and "optimize" are now separate, as with POSIX platforms. [GH #17156](https://github.com/Perl/perl5/issues/17156) https://github.com/Perl/perl5/issues/17156
  • Support for building perl with Visual C++ 6.0 has now been removed. rest in peace 🫑
  • The locale tests could crash on Win32 because of a Windows bug, and separately because of the CRT throwing an exception if the locale name wasn't validly encoded in the current code page.

For the second one, we now decode the locale name ourselves, and always decode it as UTF-8. [GH #16922](https://github.com/Perl/perl5/issues/16922) https://github.com/Perl/perl5/issues/16922

  • t/op/magic.t could fail if environment variables starting with "FOO" already existed. the FOO curse fr fr 😭
  • MYMALLOC (PERL_MALLOC) build has been fixed.

β˜€οΈ Solaris

  • "Configure" will now find recent versions of the Oracle Developer Studio compiler, which live under "/opt/developerstudio*".
  • "Configure" now uses the detected types for "gethostby*" functions, which lets Perl once again compile on certain configurations of Solaris. slay πŸŽ€

πŸ’œ VMS

  • With the release of the patch kit C99 V2.0, VSI has provided support for a number of previously-missing C99 features. On systems with that patch kit installed, Perl's configuration process will now detect the presence of the header "stdint.h" and the following functions: "fpclassify", "isblank", "isless", "llrint", "llrintl", "llround", "llroundl", "nearbyint", "round", "scalbn", and "scalbnl". look at all those little functions, so cute 🌈
  • "-Duse64bitint" is now the default on VMS. ✨

πŸ¦– z/OS

Perl 5.32 has been tested on z/OS 2.4, with the following caveats:

  • Only static builds (the default) build reliably.
  • When using locales, z/OS does not handle the "LC_MESSAGES" category properly, so when compiling perl, you should add the following to your Configure options:
./Configure <other options> -Accflags=-DNO_LOCALE_MESSAGES
  • z/OS does not support locales with threads, so when compiling a threaded perl, you should add the following to your Configure options:
./Configure <other Configure options> -Accflags=-DNO_LOCALE
  • Some CPAN modules that are shipped with perl fail at least one of their self-tests. These are: Archive::Tar, Config::Perl::V, CPAN::Meta, CPAN::Meta::YAML, Digest::MD5, Digest::SHA, Encode, ExtUtils::MakeMaker, ExtUtils::Manifest, HTTP::Tiny, IO::Compress, IPC::Cmd, JSON::PP, libnet, MIME::Base64, Module::Metadata, PerlIO::via-QuotedPrint, Pod::Checker, podlators, Pod::Simple, Socket, and Test::Harness.

The causes of the failures range from the self-test itself being flawed, and the module actually working fine, all the way up to the module not working at all on EBCDIC platforms. the full spectrum bestie, it's giving chaos πŸŒˆπŸ’€

✨ INTERNAL CHANGES ✨

okay bestie, this is the part where we peek behind the curtain πŸ‘€ β€” all the plumbing-level glow-ups that happened inside perl itself. no cap, some of these are so niche but they're all real and they all matter.

  • savepvn's len parameter is now a Size_t instead of an I32, because we can handle longer strings than 31 bits, bestie πŸ’…
  • The lexer (Perl_yylex() in toke.c) was previously a single 4100-line function, relying heavily on goto and a lot of widely-scoped local variables to do its work. It has now been pulled apart into a few dozen smaller static functions; the largest remaining chunk (yyl_word_or_keyword()) is a little over 900 lines, and consists of a single switch statement, all of whose case groups are independent. This should be much easier to understand and maintain. it's giving "we finally cleaned our room" energy and honestly? slay 🧹✨
  • The OS-level signal handlers and type (Sighandler_t) used by the perl core were declared as having three parameters, but the OS was always told to call them with one argument. This has been fixed by declaring them to have one parameter. See the merge commit v5.31.5-346-g116e19abbf for full details. fr fr the vibes were mismatched and now they match 🫢
  • The code that handles tr/// has been extensively revised, fixing various bugs, especially when the source and/or replacement strings contain characters whose code points are above 255. Some of the bugs were undocumented, one being that under some circumstances (but not all) with /s, the squeezing was done based on the source, rather than the replacement. A documented bug that got fixed was [GH #14777] <https://github.com/Perl/perl5/issues/14777>. tr/// said "let me reinvent myself" and honestly she ate πŸ’…
  • A new macro for XS writers dealing with UTF-8-encoded Unicode strings has been created "UTF8_CHK_SKIP" in perlapi that is safer in the face of malformed UTF-8 input than "UTF8_SKIP" in perlapi (but not as safe as "UTF8_SAFE_SKIP" in perlapi). It won't read past a NUL character. It has been backported in Devel::PPPort 3.55 and later. the middle child of safety macros, and we love her for it 🌈
  • Added the PL_curstackinfo->si_cxsubix field. This records the stack index of the most recently pushed sub/format/eval context. It is set and restored automatically by cx_pushsub(), cx_popsub() etc., but would need to be manually managed if you do any unusual manipulation of the context stack. auto-pilot until you start doing chaos, then it's all on you πŸ™ˆ
  • Various macros dealing with character type classification and changing case where the input is encoded in UTF-8 now require an extra parameter to prevent potential reads beyond the end of the buffer. Use of these has generated a deprecation warning since Perl 5.26. Details are in "In XS code, use of various macros dealing with UTF-8." in perldeprecation. if you've been ignoring that warning since 5.26… bestie it's time 😭
  • A new parser function parse_subsignature() allows a keyword plugin to parse a subroutine signature while use feature 'signatures' is in effect. This allows custom keywords to implement semantics similar to regular sub declarations that include signatures. [GH #16261] <https://github.com/Perl/perl5/issues/16261> custom keywords getting main character energy, periodt πŸ‘‘
  • Since on some platforms we need to hold a mutex when temporarily switching locales, new macros (STORE_LC_NUMERIC_SET_TO_NEEDED_IN, WITH_LC_NUMERIC_SET_TO_NEEDED and WITH_LC_NUMERIC_SET_TO_NEEDED_IN) have been added to make it easier to do this safely and efficiently as part of [GH #17034] <https://github.com/Perl/perl5/issues/17034>. mutex girlies rise ✨
  • The memory bookkeeping overhead for allocating an OP structure has been reduced by 8 bytes per OP on 64-bit systems. little savings, big slay πŸ“
  • eval_pv() no longer stringifies the exception when "[GH #17035]|https://github.com/Perl/perl5/issues/17035" iykyk
  • The PERL_DESTRUCT_LEVEL environment variable was formerly only honoured on perl binaries built with DEBUGGING support. It is now checked on all perl builds. Its normal use is to force perl to individually free every block of memory which it has allocated before exiting, which is useful when using automated leak detection tools such as valgrind. valgrind besties, this one's for you πŸ”₯
  • The API eval_sv() now accepts a G_RETHROW flag. If this flag is set and an exception is thrown while compiling or executing the supplied code, it will be rethrown, and eval_sv() will not return. [GH #17036] <https://github.com/Perl/perl5/issues/17036> catch it? no bestie, we're THROWING it πŸ’€
  • As part of the fix for [GH #1537] <https://github.com/Perl/perl5/issues/1537> perl_parse() now returns non-zero if exit(0) is called in a BEGIN, UNITCHECK or CHECK block. exit(0) said "I'm leaving" and perl was like "noted, and here's a non-zero for you 🫢"
  • Most functions which recursively walked an op tree during compilation have been made non-recursive. This avoids SEGVs from stack overflow when the op tree is deeply nested, such as $n == 1 ? "one" : $n == 2 ? "two" : .... (especially in code which is auto-generated). yes bestie, the auto-generated nesting hell is real and we are FREE πŸ¦‹

This is particularly noticeable where the code is compiled within a separate thread, as threads tend to have small stacks by default. threads said "my stack is tiny" and perl heard them πŸ’œ

✨ Selected Bug Fixes ✨

okay bestie, this is the part where we list all the little gremlins that got yeeted πŸ’… buckle up, there's a LOT

  • Before this, require (you know, from perlfunc) would only treat that one special built-in SV &PL_sv_undef as a value in %INC that meant "a previous require failed" β€” but any other undefined SV got treated like the previous require succeeded. Which is chaos. It could make require unexpectedly succeed, like on local %INC = %INC;. Fixed now. [GH #17428](https://github.com/Perl/perl5/issues/17428) πŸŽ€
  • (?{...}) eval groups in regexes no longer accidentally trigger EVAL without pos change exceeded limit in regex. Rude of them tbh. [GH #17490](https://github.com/Perl/perl5/issues/17490)
  • (?[...]) extended bracketed character classes were wrongly raising an error in some cases where a previously-compiled such class got interpolated into another one. The old heuristics got replaced with a reliable method, so yeah, the diagnostics it produces have changed. Go read "Diagnostics". πŸ”
  • The debug display (say, when you pass -Dr or use re with the right options) of compiled Unicode property wildcard subpatterns doesn't have that extra junk output anymore. Clean. ✨
  • Fixed an assertion failure in the regular expression engine. [GH #17372](https://github.com/Perl/perl5/issues/17372) πŸ’€
  • Fixed a coredump in pp_hot.c after B::UNOP_AUX::aux_list(). [GH #17301](https://github.com/Perl/perl5/issues/17301)
  • Loading IO is now threadsafe. slay. [GH #14816](https://github.com/Perl/perl5/issues/14816) 🧡
  • \p{user-defined} now overrides official Unicode. [GH #17025](https://github.com/Perl/perl5/issues/17025)

Before this patch, the override was only sometimes in effect. which is giving "it works when it feels like it" and honestly not the vibe.

Previously a subparse was bracketed with generated ( and ) tokens, so a spurious ) would close the construct without doing the normal subparse clean up, confusing the parser and possibly causing an assertion failure.

Such constructs are now surrounded by artificial tokens that can't be included in the source. [GH #15814](https://github.com/Perl/perl5/issues/15814)


πŸ•ŠοΈ Obituary πŸ•ŠοΈ

this next part isn't jokes, bestie. take a sec. πŸ’œ

Jeff Goff (JGOFF or DrForr), an integral part of the Perl and Raku communities and a dear friend to all of us, has passed away on March 13th, 2020. DrForr was a prominent member of the communities, attending and speaking at countless events, contributing to numerous projects, and assisting and helping in any way he could.

His passing leaves a hole in our hearts and in our communities and he will be sorely missed. πŸ•ŠοΈπŸ’”

πŸ’– ACKNOWLEDGEMENTS πŸ’–

okay so bestie, gather round, because this is the part where we hype up the literal main characters of this whole thing πŸŽ€

Perl 5.32.0 represents approximately 13 months of development since Perl 5.30.0 and contains approximately 220,000 lines of changes across 1,800 files from 89 authors. like. that's not a patch, that's a whole era 😭

Excluding auto-generated files, documentation and release tools, there were approximately 140,000 lines of changes to 880 .pm, .t, .c and .h files. no cap, that is a LOT of tiny little text files getting their glow-up ✨

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

πŸ’… the guest list. read it. every single name. they all ate.

Aaron Crane, Alberto SimΓ΅es, Alexandr Savca, Andreas KΓΆnig, Andrew Fresh, Andy Dougherty, Ask BjΓΈrn Hansen, Atsushi Sugawara, Bernhard M. Wiedemann, brian d foy, Bryan Stenson, Chad Granum, Chase Whitener, Chris 'BinGOs' Williams, Craig A. Berry, Dagfinn Ilmari MannsΓ₯ker, Dan Book, Daniel Dragan, Dan Kogai, Dave Cross, Dave Rolsky, David Cantrell, David Mitchell, Dominic Hargreaves, E. Choroba, Felipe Gasper, Florian Weimer, Graham Knop, HΓ₯kon HΓ¦gland, Hauke D, H.Merijn Brand, Hugo van der Sanden, Ichinose Shogo, James E Keenan, Jason McIntosh, Jerome Duval, Johan Vromans, John Lightsey, John Paul Adrian Glaubitz, Kang-min Liu, Karen Etheridge, Karl Williamson, Leon Timmermans, Manuel Mausz, Marc Green, Matthew Horsfall, Matt Turner, Max Maischein, Michael Haardt, Nicholas Clark, Nicolas R., Niko Tyni, Pali, Paul Evans, Paul Johnson, Paul Marquess, Peter Eisentraut, Peter John Acklam, Peter Oliver, Petr PΓ­saΕ™, Renee Baecker, Ricardo Signes, Richard Leach, Russ Allbery, Samuel Smith, Santtu OjanperΓ€, Sawyer X, Sergey Aleynikov, Sergiy Borodych, Shirakata Kentaro, Shlomi Fish, Sisyphus, Slaven Rezic, Smylers, Stefan Seifert, Steve Hay, Steve Peters, Svyatoslav, Thibault Duponchelle, Todd Rinaldo, Tomasz Konojacki, Tom Hukins, Tony Cook, Unicode Consortium, VanL, Vickenty Fesunov, Vitali Peil, 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. yeah so if you're not on here and you filed a bug: you're still iconic, the list just literally can't see you πŸ™ˆ

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. CPAN nation, we see you, we love you 🫢

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 perl bug database at <https://github.com/Perl/perl5/issues>. There may also be information at <http://www.perl.org/>, the Perl Home Page. go look first, bestie, someone might've already posted it πŸ”

If you believe you have an unreported bug, please open an issue at <https://github.com/Perl/perl5/issues>. Be sure to trim your bug down to a tiny but sufficient test case. fr fr, the tiny test case is the whole assignment β€” nobody wants your entire 4,000-line app dropped in the thread πŸ’€

⚠️ If the bug you are reporting has security implications which make it inappropriate to send to a public issue tracker, then see "SECURITY VULNERABILITY CONTACT INFORMATION" in perlsec for details of how to report the issue. do not post that one publicly. that's the vibe check. πŸ™ˆ

🫢 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 perlthanks program:

perlthanks

This will send an email to the Perl 5 Porters list with your show of thanks. it's giving gratitude, it's giving community, it's giving one command ✨ literally the easiest nice thing you'll do all day πŸŽ€


πŸ‘€ SEE ALSO πŸ‘€

  • 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.

and that's the whole page, bestie πŸ’œ that was perl v5.42.3, dated 2026-08-03, and it's the PERL5320DELTA(1) man page β€” you made it all the way to the end, which is lowkey a flex πŸ‘‘ go forth and slay πŸŒˆπŸ’–

πŸ“¦ where this page comes from