PERL5440DELTA(1perl)
π PERL5440DELTA π
PERL5440DELTA(1perl) β Perl Programmers Reference Guide β this is part of Perl itself, bestie.
π NAME π
perldelta β what is new for perl v5.44.0 β¨
β¨ DESCRIPTION β¨
Okay so this doc walks you through literally every difference between the 5.42.0 release and the 5.44.0 release. That's it. That's the whole vibe. Grab a snack, it's a long one. π
π₯ Core Enhancements π₯
π Named Parameters in Signatures π
This adds a major new ability to subroutine signatures: now callers can pass parameters by name/value pairs instead of by position. Not me getting named args in core Perl ππ
sub f ($x, $y, :$alpha, :$beta = undef) { ... }
f( 123, 456, alpha => 789 );
Originally specified in PPC0024 <https://github.com/Perl/PPCs/blob/main/ppcs/ppc0024-signature-named-parameters.md>.
This feature is currently considered experimental, and it's described in further detail in "Signatures" in perlsub. π«Ά
π¦ Multi-variable foreach can now use aliased references π¦
Perl version 5.22 introduced reference aliases, which let a foreach loop iteration variable create new aliases to references. Perl version 5.36 introduced foreach loops with multiple variables, consuming more than one input list item on each iteration. New in this version: the two features can finally be used together, so you can have multiple iteration variables where any of them are permitted to be reference aliases. The way that these two just clicked together... obsessed. π
use v5.44;
use feature qw( refaliasing declared_refs );
my %hash = (
one => [1],
two => [2, 2],
);
foreach my ( $key, \@items ) ( %hash ) {
say "The $key array contains: @items";
}
Currently both the refaliasing and declared_refs features remain experimental. π
π Enhanced operation of regular expression patterns under /xx π
Experimentally, the /xx pattern modifier can allow bracketed character classes (e.g., [a-zA-Z] to extend across multiple lines and to contain comments, and to warn you of potential cases where a portion of a pattern inadvertently has been treated as a comment instead of what you intended. This behavior is enabled by use feature "enhanced_xx". See "/x and /xx" in perlre. Regex girlies stay winning. β¨
πΈ Unicode 17.0 is supported πΈ
See <https://www.unicode.org/versions/Unicode17.0.0/>. Slay. π
π§ New source of entropy for PRNG seeding π§
Perl now uses the getentropy() system call to fetch random bytes suitable for seeding the internal PRNG. Previously Perl would read raw bytes from the /dev/urandom device. Perl now seeds itself in this order (and falls through upon failure):
getentropy()on systems that support this call (Linux, BSD, MacOS)/dev/urandomon systems that have it- Hash of internal state variables: Unix time, process ID, and pointer value
β οΈ Note that the internal PRNG is still unsuitable for security applications. See "rand EXPR" inperlfuncfor a discussion of security. Don't use it for your crypto, bestie, I'm begging. π
π Security π
CVE-2026-8376 β Buffer overflow in Perl_study_chunk
Perl_study_chunk in regcomp_study.c checked the size of the joined substring buffer in characters rather than bytes. On 32-bit builds, this can lead to an integer overflow of the size of the buffer leading to out-of-bounds writes. Ma'am. π
CVE-2026-57432 β Buffer overflow in S_measure_struct
If you call pack or unpack to operate on a structure whose computed size is too large to fit in memory, an integer overflow could happen that would result in a buffer overflow. This usually happens as a result of embedding a large number as the repeat count for an item.
CVE-2026-13221 β Regex trie 16-bit field overflow
The trie optimization in the regex engine could overflow in an alternation with more than ~65k branches. This could cause both false positives and false negatives on such regular expressions. Not the regex engine gaslighting you π
π Incompatible Changes π
π Unicode rules are now fully enforced on identifier and regular expression group names. π
Okay history lesson, stay with me. Before Unicode, Perl accepted any \w character in an identifier or other name, except the first character couldn't be a digit. Later, Unicode created two properties that described this. Even later, they found those properties to be insufficient, and created two new similar properties. These are the ones that perl has intended to use since: \p{XID_Start} and \p{XID_Continue}. (The X stands for "eXtended" and indicates these are the more modern versions.)
(And even later, long after Perl identifier rules were formed using the above properties, Unicode added recommendations to further restrict legal identifier names. These were added to counter cases where, for example, programmers snuck code past reviewers using characters that look like other ones. The two properties are Identifier_Status and Identifier_Type. See <https://www.unicode.org/reports/tr39/>. Perl currently doesn't do anything with these, except to furnish you the ability to use them in regular expressions.)
We soon discovered that there were 14 characters that match XID_Start and XID_Continue that don't also match \w. To avoid breaking code that had long relied on \w, we chose to not add those to the list of acceptable identifier characters.
It turns out that there are about 160 characters that match \w but not the Unicode XID properties. Thus they are illegal according to Unicode. Those are now explicitly forbidden in both Perl identifiers and regular expression group names. Previously, it was likely that their use in identifiers wouldn't work anyway; they could be accepted initially as legal, but other code would later reject them, but with a message that had nothing to do with the underlying problem. However group names in regular expression patterns could contain illegal continuation characters and have a higher probability of not being caught. That is now changed.
Only programs that do use utf8 can be affected, and then only characters that appear in the 2nd or later positions of the name. The characters that an identifier name can begin with are unchanged.
130 of the now unacceptable characters are 5 sets of 26 Latin letters that are enclosed by some shape, such as CIRCLED LATIN CAPITAL LETTER N. Another 8 are generic modifiers that add shapes around other characters; 5 are modifiers to Cyrillic numbers; and 16 are Arabic ligatures and isolated forms. The other two are GREEK YPOGEGRAMMENI and VERTICAL TILDE. Rip to those specifically. π―οΈ
π Deprecations π
- Deprecated since 5.12, using
gototo jump into the body of a loop or other block construct from outside is no longer permitted. [GH #23618 <https://github.com/Perl/perl5/issues/23618>] m/...[...].../xxhas new restrictions
Using an unescaped # or literal vertical space is now deprecated in a regular expression bracketed character class that is compiled with the /xx modifier. These still work, but deprecation warnings will be generated unless turned off or the constructs are cured as follows.
- Escape a
#by preceding it with a backslash, like in
m/ [ % \# ( ) ] /xx
- Use constructs like
\ninstead of literal vertical space.
β Performance Enhancements β
- Simple (non-overflowing) addition (
+), subtraction (-) and multiplication (*) of integers are slightly sped up, as long as sufficient underlying C compiler support is available. Math but make it zippy π - Populating a hash from a list of key/value pairs when the keys are constant string operands known at compile time is commonly now faster. [GH #24228 <https://github.com/Perl/perl5/issues/24228>]
- Processing of signatures at the start of a subroutine under the
signaturesfeature is now more efficient at runtime. ποΈβ¨
π Modules and Pragmata π
β¨ Updated Modules and Pragmata β¨
okay bestie, grab a snack because this is the upgrade haul and it's long. every single one of these got a glow-up in this release:
Archive::Tarβ upgraded from version3.04to3.12. π
This fixes CVE-2026-9538, CVE-2026-42496, and CVE-2026-42497.
attributesβ upgraded from version0.36to0.37.Bβ upgraded from version1.89to1.92.B::Conciseβ upgraded from version1.007to1.012.B::Deparseβ upgraded from version1.85to1.89.charnamesβ upgraded from version1.50to1.51.Compress::Raw::Bzip2β upgraded from version2.213to2.218.Compress::Raw::Zlibβ upgraded from version2.213to2.222.Config::Perl::Vβ upgraded from version0.38to0.39.CPAN::Metaβ upgraded from version2.150010to2.150013.CPAN::Meta::Requirementsβ upgraded from version2.143to2.145.DB_Fileβ upgraded from version1.859to1.860.Encodeβ upgraded from version3.21to3.24.Englishβ upgraded from version1.11to1.12.Errnoβ upgraded from version1.38to1.39.experimentalβ upgraded from version0.035to0.036.ExtUtils::CBuilderβ upgraded from version0.280242to0.280243.ExtUtils::MakeMakerβ upgraded from version7.76to7.78.ExtUtils::Miniperlβ upgraded from version1.14to1.15.ExtUtils::ParseXSβ upgraded from version3.57to3.63.ExtUtils::Typemapsβ upgraded from version3.57to3.63.featureβ upgraded from version1.97to2.02.File::Copyβ upgraded from version2.41to2.43.File::Fetchβ upgraded from version1.04to1.08.File::Globβ upgraded from version1.42to1.44.File::Specβ upgraded from version3.94to3.95.File::statβ upgraded from version1.14to1.15.File::Tempβ upgraded from version0.2311to0.2312.Filter::Simpleβ upgraded from version0.96to0.97.Filter::Util::Callβ upgraded from version1.64to1.65.Getopt::Stdβ upgraded from version1.14to1.15.HTTP::Tinyβ upgraded from version0.090to0.096. π₯
This fixes CVE-2026-7010 and CVE-2026-7017.
IOβ upgraded from version1.55to1.56.IO::Compressβ upgraded from version2.213to2.223. π
This fixes CVE-2025-15649, CVE-2026-48961, CVE-2026-48962, and CVE-2026-48959.
IO::Socket::IPβ upgraded from version0.43to0.44.Math::BigIntβ upgraded from version2.005002to2.005003.Module::CoreListβ upgraded from version5.20250702to5.20260708.Module::Metadataβ upgraded from version1.000038to1.000039.mroβ upgraded from version1.29to1.30.Net::Pingβ upgraded from version2.76to2.77.Opcodeβ upgraded from version1.69to1.71.overloadingβ upgraded from version0.02to0.03.PerlIO::viaβ upgraded from version0.19to0.21.Pod::Htmlβ upgraded from version1.35to1.36.Pod::Simpleβ upgraded from version3.45to3.48.POSIXβ upgraded from version2.23to2.26.Scalar::Utilβ upgraded from version1.68_01to1.70.SelectSaverβ upgraded from version1.02to1.03.SelfLoaderβ upgraded from version1.28to1.29.Socketβ upgraded from version2.038to2.041. π«Ά
This fixes CVE-2026-12087.
Storableβ upgraded from version3.37to3.41. π‘οΈ
This fixes CVE-2026-57433.
Term::Tableβ upgraded from version0.024to0.028.Test::Harnessβ upgraded from version3.50to3.52.Test::Simpleβ upgraded from version1.302210to1.302219.Text::Balancedβ upgraded from version2.06to2.07.threadsβ upgraded from version2.43to2.45.threads::sharedβ upgraded from version1.70to1.73.Time::HiResβ upgraded from version1.9778to1.9780.Time::Pieceβ upgraded from version1.36to1.41.Unicode::UCDβ upgraded from version0.81to0.83.UNIVERSALβ upgraded from version1.17to1.18.utf8β upgraded from version1.27to1.29.versionβ upgraded from version0.9933to0.9934.warningsβ upgraded from version1.74to1.78.XS::APItestβ upgraded from version1.43to1.50.XS::Typemapβ upgraded from version0.20to0.22.
periodt, that's the whole roster π
π Documentation π
πΈ Changes to Existing Documentation πΈ
bestie, we tried to update the docs so they actually match all the stuff listed in this document. If you spot something we missed, go open an issue at https://github.com/Perl/perl5/issues. π
And also, these specific changes happened:
perlapi
- Auto-generation of this document now includes the line number of the source code, as well as its documentation. β
- It now contains information about how to find what release of Perl first contained an API element.
perlexperiment
- New entry for "New object system and "class" syntax". β¨
perlxs
- The reference manual for writing Perl XS code has been completely rewritten and modernized. It is about twice the size of the old file, and promotes more modern XS syntax, such as ANSI signatures. π
π©Ί 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.
π Changes to Existing Diagnostics π
Use of uninitialized value%s
This warning was issued in the reverse order (right-to-left) when both operands of a binary operator are uninitialized values. This is now fixed to be consistent with evaluation order of operands. π§
- Certain diagnostics about byte sequences that are supposed to comprise a UTF-8 encoded character, but that are invalid in some way, now don't include bytes irrelevant to that determination. An example is
old message
Malformed UTF-8 character: "\xc1\x27" (any UTF-8 sequence that
starts with "\xc1" is overlong which can and should be
represented with a different, shorter sequence)
new message
Malformed UTF-8 character: "\xc1" (any UTF-8 sequence that
starts with "\xc1" is overlong which can and should be
represented with a different, shorter sequence)
In this case the "\xc1" is all that is needed to make the sequence invalid. Whatever comes after it is irrelevant (in this case, "\x27"), and including it in the message might lead the reader to think that it somehow does matter. π
- The error
Unrecognised parameters for "%s" constructor: %shas been changed toUnrecognized parameters for "%s" constructor: %s. (yes bestie, they fixed the spelling, iconic behaviour π ) - Variables whose name started with
^_were incorrectly shown in diagnostics with a literalCtrl-_(which is an invisible ASCII character) in their name.
The names of variables whose names begin with a caret and are longer than two characters are now wrapped in braces, just as they have to be in the source code.
Therefore, using an undefined "${^_FOO}" will now correctly warn with Use of uninitialized value ${^_FOO}, instead of the earlier Use of uninitialized value $FOO (with a literal Ctrl-_ after the dollar sign).
[GH #24135 <https://github.com/Perl/perl5/issues/24135>]
- Calling the
importmethod on a package with noimportmethod now produces a regular warning rather than a deprecation warning or error. π
Since Perl 5.39.1, calling import with arguments on a package without such a method has triggered a deprecation warning. In Perl 5.43.6, this deprecation was promoted into an error. This broke a significant amount of code while providing very little advantage over the warning. This fatal error has been converted back to a warning, with its deprecation status removed. There are no longer any plans to make this fatal in the future. The category for this warning is missing_import and it is enabled by default.
π New Diagnostics π
New Errors
Can't redeclare catch variable as "%s"
(F) A my, our or state keyword was used with the exception variable in a catch block:
try { ... }
catch (my $e) { ... }
# or catch (our $e) { ... }
# or catch (state $e) { ... }
This is not valid syntax. catch takes a bare variable name, which is automatically lexically declared. [GH #23222 <https://github.com/Perl/perl5/issues/23222>]
Use of "goto" to jump into a construct is no longer permitted
(F) You have used goto LABEL; or goto EXPR; in an attempt to jump into the body of a loop or other block construct from the outside. As of Perl 5.44, this throws an exception. π¨
\x{%X} is a \w char that isn't valid in a name "%s"
In most cases where this message now appears, an error would have occurred anyway, but the text would not have been helpful in finding the problem.
New Warnings
Possible attempt to escape whitespace in qw() list
(W qw) qw() lists contain items separated by whitespace; contrary to what some might expect, backslash characters cannot be used to "protect" whitespace from being split, but are instead treated as literal data.
Note that this warning is only emitted when the backslash is followed by actual whitespace (that qw splits on). π
π§ Configuration and Compilation π§
- C23
<stdckdint.h>and associated macros are now used if available. - It is now possible to pass to Configure the values dealing with POSIX locale categories, overriding its automatic calculation of these. This enables cross-compilation to work. The easiest way to do this is to extract the C program that does the calculation from Configure and then run it on the target machine, and then pass the values it outputs to Configure on the other machine.
Porting/Glossaryhas examples.[GH #22992 <https://github.com/Perl/perl5/issues/22992>]π - The
"PERL_CREATE_GVSV"configuration macro has been removed. It was almost undocumented and it has been disabled by default since Perl5.10.0. Its purpose was to force all GVs to initialize their SV slot on creation.[GH #24177 <https://github.com/Perl/perl5/issues/24177>]
β¨ Testing β¨
Okay bestie, tests got added and changed to keep up with literally everything else in this release π and like, on top of that, here's what went down:
- Karl Williamson gave a whole talk at TPRC 2025 asking people to contribute tests that hunt down old issues which are no longer a problem, plus todo tests to capture reproduction cases for known outstanding bugs. (video link:
https://www.youtube.com/watch?v=CwX4Xsf5y5E) It picked up renewed interest this year, which led to an uptick in test submissions from brand-new authors, and we are extremely grateful for that π«Ά - When you're testing embedding, there's now a sanity check that makes sure the
libperlwe link against actually matches the perl we're building. [GH #22125https://github.com/Perl/perl5/issues/22125]
π Platform Support π
π Platform-Specific Notes π
πͺ Windows
- Fixed builds where
USE_IMP_SYSis defined butUSE_ITHREADSis not defined.
π‘ OpenBSD
- When testing embedding, make sure we link against the correct static libperl. [GH #22125
https://github.com/Perl/perl5/issues/22125]
π§΅ AIX
- Thread-safe locale handling has been turned off on all releases, because the underlying operating system support apparently has bugs. Yeah. Off. π
- The
ibm-clang/ibm-clang_rIBM Open XL C/C++ compiler is now supported for AIX 7.2 and 7.3. And ngl, this is the compiler you should be using when compiling Perl on these versions of AIX β it's the recommended one, periodt.
π z/OS
clangis now the only supported compiler. That's it, that's the whole vibe.- There's a single test failure still hanging around for the core Perl test suite:
It's for a misleading warning message in an edge case involving reading malformed UTF-8 in XS-APItest/t/utf8_warn00.t. (Several instances of the same failure occur.) Yeah, it's not just one lonely little fail, it keeps showing up π
- Some cpan modules shipped with core have known problems:
EncodeExtUtils-MakeMakerHTTP-TinyIO-CompressJSON-PPlibnetMIME-Base64PerlIO-via-QuotedPrintPod-CheckerpodlatorsPod-Simple
Check for updates to these on cpan, bestie π
- Good news: you can get a perl that works in ASCII mode.
An open source project has been created to modify the official perl so it works on z/OS in ASCII mode. See https://github.com/zopencommunity/perlport. Slay π¦
β¨ Internal Changes β¨
okay bestie, this section is the backstage tour π β none of it is for the general public, it's all plumbing that keeps the whole thing running. but every single detail matters so let's go π«Ά
- The XS parser,
ExtUtils::ParseXS, has been further extensively restructured internally β like, a full glow-up from the inside out π . Most of these changes shouldn't be visible externally, but they might affect XS code that was using invalid or unsupported syntax. Several minor bug-fixes were included in the process. - Removed the deprecated (since 5.32) functions
sv_locking()andsv_unlocking. they're gone, bye, no cap π Perl_expected_sizehas been added as an experimental stub macro. The intention is to build on this such that it can be passed a size in bytes, then returns the interpreter's best informed guess of what actual usable allocation size would be returned by themallocimplementation in use.
This would help with sizing allocations such that SvLEN is more accurate and not trying to shrink string buffers to save size when the intended saving is unrealistic. π
SvPV_shrink_to_curhas been revised to include a byte for copy-on-write (COW), so that the resulting string could be COWed in the future.
It also now uses Perl_expected_size, compared against the current buffer size, and does not try to do a reallocation if the requested memory saving is unrealistic. girl math but make it correct β¨
sv_vcatpvfn_flags()now substitutes the Unicode REPLACEMENT CHARACTER for malformed input. Previously it used the NUL character. glow-up of the year honestly π- For core Perl maintainers, the syntax of
embed.fnchas been extended. Every function,foo(), named in that file has generated for it a macro namedPERL_ARGS_ASSERT_FOO. The macro expands toassert()calls that do basic sanity checking for each argument tofoo()that we currently deem as being appropriate to have such checking. (That means that many arguments are not checked, and that the generated macro may currently expand to nothing.) With this release, you can addassert()statements yourself toembed.fncthat will be incorporated into the generated macro, beyond the system-generated ones. Comments and examples inembed.fncgive details. π - A new function
valid_utf8_to_uvhas been added. This is synonymous withvalid_utf8_to_uvchr; its reason for existence is to have consistent spelling with the names of the other functions that translate from UTF-8, so you don't have to remember a different spelling. the way that past-you made everyone memorize an inconsistent name... not anymore π "newSVsv_flags_NN"in perlapi is a new function for creating a new SV and assigning the value(s) of an existing SV to it.
Historically, Perl_newSVsv_flags and Perl_sv_mortalcopy_flags would pass a new SV head and the original SV to Perl_sv_setsv_flags. However, the latter contains many branches of no relevance to a fresh SV, so they now make use of the new function to streamline the process.
Perl_newSVsv_flags is now essentially a NULL pointer check and wrapper around the new function, so has been moved into sv_inline.h. iconic behavior, no wasted work π
"STATIC_ASSERT_DECL"in perlapi andSTATIC_ASSERT_STMTare likeassert(), but are evaluated at compile time. That means their argument must be a constant expression that can be verified by the compiler, and so they effectively have no cost, not appearing in the code that gets executed. These were added in v5.28, but not until now have we opened their use up to XS writers. At the same time, a new variant has been added,STATIC_ASSERT_EXPRwhich is suitable for use in an expression, such as a comma expression in a C macro. free real estate, lowkey π¦Perl_sv_backoff, which undoes theOOKstring offset mechanism, now only moves the string buffer contents to the start of the buffer ifSvOK(sv)is true. Historically, the buffer contents were always moved, but if the buffer contents are defunct and no longer required, doing that incurs an unnecessary cost proportional to the size of the shifted contents.
(The assumption in this change is that SvOK(sv) is a valid indicator of whether the string buffer contents are "live" or not.)
See [GH #23967 <https://github.com/Perl/perl5/issues/23967>] for an example of where such a copy was noticeable. π
- Fixed a bug in the
sv_numeqin perlapi API where values with numeric (0+) overloading but not equality or numeric comparison overloading would always be compared as floating point values. This could lead to large integers being reported as equal when they weren't. π¨ the drama of that bug was unmatched - Fixed a bug in
sv_numeqin perlapi where theSV_SKIP_OVERLOADflag would skip operator overloading, but would still honor numeric (0+) overloading. - Added
sv_numnein perlapi,sv_numle,sv_numlt,sv_numge,sv_numgtandsv_numcmpin perlapi APIs that perform numeric comparison in the same way perl does, including overloading. Separate APIs for each comparison are needed to invoke their corresponding overload when needed. Inspired by [GH #23918 <https://github.com/Perl/perl5/issues/23918>]
This also extends the sv_numeq API to support SV_FORCE_OVERLOAD. π₯
- Added the
AMGf_force_scalarflag to the"amagic_call"in perlapi API to force scalar context for overload calls. - Added the
AMGf_force_overloadflag to the"amagic_call"in perlapi API to allow forcing overloading to be honored even in the context ofno overloading;. - The
SvFLAGSbits used bySvPCS_IMPORTED()andSvOOK()have now been merged into the same position, thus freeing up a flags bit for possible future purposes. This merge is distinguished by the fact that thePCS_IMPORTEDbehaviour is only used on references (whenSvROKis true), whereas theOOKonly applies to string buffers (whenSvROKis false).
This change shouldn't affect any XS module code that is using the test macros correctly, though might cause confusion to code that attempts to analyse SvFLAGS bits directly outside of the helper macros. β οΈ stay in your lane and use the macros, bestie
- An upper limit has been applied to the multiplier operand of the repetition operator. Constant folding will not be attempted if the operand is a numerical constant above
PERL_FOLD_REPEAT_LIMIT. See [GH #20586 <https://github.com/Perl/perl5/issues/20586>] and [GH #23561 <https://github.com/Perl/perl5/issues/23561>] for background. π - Dedicated check functions
Perl_ck_anonhashandPerl_ck_aassignhave been added and are used to hekify someOP_CONSThash keys at compile time. [GH #24228 <https://github.com/Perl/perl5/issues/24228>] - The macro
"fromCTRL"in perlapi has been added to be the inverse of the existing"toCTRL"in perlapi.toCTRL('A')yields1(the control characterSOHon all platforms Perl works on);fromCTRL(1)yields'A'. it's giving symmetry π Perl_check_hash_fields_and_hekify, partly called as a compile-time optimization, no longer preemptively converts an NV to a HEK if the compile time and run time locales could differ. [GH #24252 <https://github.com/Perl/perl5/issues/24252>]- When a UTF-8 constant string was used as the hash key in an insert operation, such as
$hash{'ΓΌber maus'} = 1;, and the string could be converted into a single byte representation, the flag noting the original encoding (HVhek_WASUTF8) was not always retained.
When this occurred, the relevant scalars returned by keys %hash would not be in the original, expected UTF-8 encoding.
The original encoding is now captured and propagated. [GH #24266 <https://github.com/Perl/perl5/issues/24266>] [GH #24290 <https://github.com/Perl/perl5/pull/24290>] πΈ the encoding said remember me and now it does
- When a constant IV or NV was used as a hash key, such as in
my %hash = ( 42 => 0 );, and was preemptively stringified into a hash key, the fact that the numerical value came first was lost. This unintentionally modifieddeparseoutput for such keys.
The numerical values are now carried across, and flags on the key variable reflect the original data type.
Note: This now preserves the form of constant keys supplied to tied hashes in list assignments. [GH #24302 <https://github.com/Perl/perl5/issues/24302>]
- A new function,
defer_errorin perlapi, has been added to report errors in compiling a perl program.qerrorin perlapi is a deprecated alias for it. Previously,qerrorexisted but was undocumented. π
[GH #23676 <https://github.com/Perl/perl5/issues/23676>]
op_clearin perlapi is now part of the API. π
[GH #23676 <https://github.com/Perl/perl5/issues/23676>]
π Selected Bug Fixes π
Okay bestie, buckle up β this is the part where all the little gremlins that got squashed get their moment. Every single one, no skipping π
Reported argument counts in method signatures now account for $self
So in old Perl, when a method subroutine with a signature didn't get the right number of args, the exception message was doing the math wrong β it forgot about the implicit $self parameter, so the numbers it shouted at you were 1 fewer than intended. Rude.
Fixed now β the messages report the correct number of arguments including the object invocant. Slay.
Overloaded arithmetic + use integer; operand order
When both operands of arithmetic operators (+, -, etc.) are overloaded objects that have no method for that operator but do have a 0+ method and the fallback option set to TRUE, perl will normally call the 0+ method for the left operand first and then call one for the right operand β i.e. in the same order as operand evaluation. Makes sense, right?
But if use integer; is in effect, those 0+ methods used to be called in the wrong (reverse) order. Not anymore π
Two-variable for loops crashing the compiler in v5.42.0
Certain constructs involving a two-variable for loop would crash the perl compiler in v5.42.0, specifically:
# Two-variable for loop over a list returned from a method call:
for my ($x, $y) (Some::Class->foo()) { ... }
for my ($x, $y) ($object->foo()) { ... }
and
# Two-variable for loop over a list returned from a call to a
# lexical(ly imported) subroutine, all inside a lexically scoped
# or anonymous subroutine:
my sub foo { ... }
my $fn = sub {
for my ($x, $y) (foo()) { ... }
};
use builtin qw(indexed); # lexical import!
my sub bar {
for my ($x, $y) (indexed(...)) { ... }
}
These have been fixed. π [GH #23405] https://github.com/Perl/perl5/issues/23405
pack and unpack error conditions
Several error conditions in the pack and unpack operations were just... not being detected? And now they are. Caught in 4K π
INTERFACE keyword in XS
Two things here, bestie:
INTERFACEis now compatible with ISO/IEC 9899:2024 (C23), which is the default language version used by GCC 15. Before this, it generated code that straight-up failed to compile as C23. π- Secondly,
INTERFACEnow supports Perl package names as C types (i.e.Foo::Bargets auto-converted toFoo__Bar). Cute.
[GH #23192] https://github.com/Perl/perl5/issues/23192
&CORE::__CLASS__ no longer returns invalid results
CORE::__CLASS__ would work as expected when used as a bareword or aliased:
use feature qw(class);
class Foo {
BEGIN { *cls = \&CORE::__CLASS__; }
method bar() {
my $class1 = CORE::__CLASS__; # ok
my $class2 = cls; # ok
}
}
But when called with an ampersand (&CORE::__CLASS__()) or through a reference (my $ref = \&CORE::__CLASS__; $ref->()), it would return unrelated strings. π³ These runtime calls have been fixed to throw an error of the form &CORE::__CLASS__ cannot be called directly instead of silently returning incorrect results. No more lying to us, periodt.
[GH #23737] https://github.com/Perl/perl5/issues/23737
parse_subsignature() can now handle empty subroutine signatures
Previously, calling the parse_subsignature() API function with an empty signature would cause a Syntax error failure, which meant code calling it had to detect that special case and take appropriate steps. Tired. Now it's fixed β it returns the same optree that the parser would yield for a regular empty signature during normal parse time. π«Ά
[GH #17689] https://github.com/Perl/perl5/issues/17689
-CA and -s are finally on speaking terms
The -CA flag (or equivalently, the PERL_UNICODE=A environment setting) tells perl to treat command-line arguments as UTF-8 strings. (See perlrun for the deets.) However, this did not extend to the global variables implicitly created by the -s option:
$ perl -CA -s -e 'printf "%vx\n", $_ for $foo, $ARGV[0]' -- -foo=Γ© Γ©
c3.a9
e9
Here $foo would end up containing the two-byte UTF-8 representation of LATIN SMALL LETTER E WITH ACUTE, but $ARGV[0] would contain a single codepoint corresponding to U+00E9. A mess. π
This has been fixed: If -CA is in effect, options parsed by -s are treated as UTF-8, too. In the example above, $foo and $ARGV[0] now both contain chr(0xE9). [GH #23377] https://github.com/Perl/perl5/issues/23377
Identifiers up to 255 characters β for real this time
We've long claimed to support identifiers up to about 255 characters long. However this was actually true only for identifiers that consisted of only ASCII characters. The real upper limit was as few as 64 characters for identifiers written in languages using non-ASCII characters β for example, Chinese or Osage. π
Now an identifier in any language may contain at least 255 characters. Equality. We love to see it π
Array names starting with a digit
Fixed parsing of array names starting with a digit in double-quotish context under use utf8;.
use 5.42 turns on use source::encoding "ascii"
use 5.42 now turns on use source::encoding "ascii" for the remainder of the line (besides subsequent lines). [GH #23881] https://github.com/Perl/perl5/issues/23881
Ternary second branch autovivification
Since 5.32.0, the second branch of a ternary condition operator wasn't getting the correct autovivification context applied. For example, in something like
@{ $cond ? $h{foo} : $h{bar} } = ...;
the first branch would correctly autovivify $h{foo} to an array ref, but the second branch might incorrectly autovivify $h{bar} to a hash ref. π [GH #18669] https://github.com/Perl/perl5/issues/18669
No warning while DIE-ing
Don't warn about jumping into a construct if we're DIE-ing. [GH #23922] https://github.com/Perl/perl5/pull/23922
Regex sub-patterns + cuts causing premature scope exit
Regexes which include both a sub-pattern (e.g. (??{...}) or (?&FOO)) and a cut (i.e. (?>...)) could sometimes cause a premature scope exit in other code during a match. For example, in something like (?{ local $x = ... }), the local might have been unwound before the pattern has finished matching. Not cute. π€ [GH #16197] https://github.com/Perl/perl5/issues/16197
DB::sub and overloaded subs in the DB package
DB::sub is not meant to be called for sub calls from the DB package, but calls to overloaded subs for overloaded values used in the DB package would result in calls to DB::sub. Fixed the check for the current package in amagic_call(). [GH #24001] https://github.com/Perl/perl5/issues/24001.
Parsing hexadecimal floating-point numbers with huge significands
Fix parsing of hexadecimal floating-point numbers whose significand (aka mantissa) values are too large to fit in UV range. Such literals (for example, 0x1234567890.1p+0 for 32-bit IV/UV platform, or 0x1234567890_1234567890.1p+0 for 64-bit IV/UV) used to be parsed incorrectly. Fixed π
Daylight savings time (5.42.0 β 5.42.1)
Perl 5.42.0 did not handle the transition to/from daylight savings time properly β fixed in 5.42.1. The time and/or timezone could be off by an hour in the intervals surrounding such transitions. This was a regression from earlier releases. The bug was evident from perl space in the strftime in POSIX function, and in XS code with any of my_strftime in perlapi, sv_strftime_ints in perlapi, or sv_strftime_tm in perlapi. β°
sort() overloaded numeric comparison precision
sort() optimizes common comparisons from calling the OP tree for a comparison block into a call to a C function. The C function used for overloaded numeric comparisons did not handle the case where there was no comparison overload but there was a numeric (0+) overload correctly β losing precision for large overloaded integer arguments that are not exactly representable as a Perl floating point value (NV). [GH #23956] https://github.com/Perl/perl5/issues/23956
undef-ing a scalar that's a filehandle target mid-output
When a scalar variable used as the target of a filehandle is undef'ed while being output, garbage bytes would be left in that scalar. ποΈ [GH #24008] https://github.com/Perl/perl5/issues/24008
A scalar filehandle target outputting onto itself
When a scalar variable was used as the target of a filehandle and also was output onto itself, garbage could result β or even a segmentation fault. Like this:
open $fh, '>', \$str; print $fh $str;
[GH #24199] https://github.com/Perl/perl5/issues/24199
close(STDOUT) on a pipe, on Windows
close(STDOUT) when STDOUT has been opened as a pipe will now properly wait for the child to exit on Windows. [GH #4106] https://github.com/Perl/perl5/issues/4106
XSUB via goto in scalar context
Calling an XSUB via goto in scalar context, where the XSUB didn't return exactly one value, could result in the return of the wrong number of items, leading to potential stack corruption. π± For example:
sub wrap { goto \&an_xsub_which_returns_no_values }
$ret = wrap();
[GH #24212] https://github.com/Perl/perl5/issues/24212
Empty array field initializer list on debugging perls
On debugging perls, instantiating a class with an array field with an empty initializer list would abort with an error:
class Foo {
field @bar = ();
}
Foo->new();
Error message: perl: inline.h:194: Perl_av_new_alloc: Assertion size > 0' failed.`
This has been fixed. [GH #24246] https://github.com/Perl/perl5/issues/24246
Refassigning to a class field in a method
Refassigning to a class field in a method could result in the SV for that field being released when the method exited. π The next access to that field could result in a crash or an assertion β or, if the freed SV had been re-used, random data. Discussed in [GH #24187] https://github.com/Perl/perl5/issues/24187
β¨ Known Problems β¨
None π
ποΈ Obituary ποΈ
"WELL VOLUNTEERED!" echoed across conference rooms and IRC channels. Matt S. Trout's battle cry that transformed reluctant volunteers into community leaders.
With profound sadness, we announce Matt's passing. Since the early 2000s, Matt shaped Perl through sheer force of will: IRC operator, PAUSE administrator, Shadowcat Systems co-founder, architect of DBIx::Class. His opinions came wrapped in profanity and delivered at maximum volume. He suffered no fools and grew to sometimes realize he should apologize. Yet this same abrasive exterior protected fierce dedication to mentoring, developers he harangued into volunteering now lead the community themselves. Matt's deliberately mind-bending code pushed Perl forward. Every modern Perl developer touches his legacy daily.
Well volunteered, Matt. Rest in peace. π«Ά
π Acknowledgements (the icon award ceremony) π
Perl 5.44.0 represents approximately 12 months of development since Perl 5.42.0 and contains approximately 270,000 lines of changes across 1,300 files from 71 authors.
Excluding auto-generated files, documentation and release tools, there were approximately 110,000 lines of changes to 860 .pm, .t, .c and .h files.
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.44.0:
Alexander Karelas, Aristotle Pagaltzis, Arne Johannessen, Bartosz Jarzyna, Branislav ZahradnΓk, brian d foy, Chad Granum, Chris 'BinGOs' Williams, Chris Prather, Christian Hansen, Craig A. Berry, Dagfinn Ilmari MannsΓ₯ker, Dan Book, Dan Church, Daniel Dragan, Daniel LaΓΌgt, Daniel Tang, Dan Kogai, Dave Cross, David Mitchell, Dmitrii Kuvaiskii, E. Choroba, Ed J, Elvin Aslanov, Eric Herman, Eugen Konkov, Graham Knop, Harald JΓΆrg, H.Merijn Brand, Igor Todorovski, James Cook, James E Keenan, James Raspass, JΓΆrg Thomas, Karen Etheridge, Karl Williamson, Leon Timmermans, Lukas Mai, Marc Reisner, Masahiro Iuchi, Matthew Horsfall, Maxim Vuets, Max Maischein, Nicolas R, Olaf Alders, Paul Evans, Paul Marquess, Peter John Acklam, Philippe Bruhat (BooK), Ricardo Signes, Richard Leach, Robert Rothenberg, Ryan Carsten Schmidt, Samuel Smith, Samuel Young, Scott Baker, Sevan Janiyan, Shirakata Kentaro, Sisyphus, Stan Ulbrych, Stefan Adams, Ε tΔpΓ‘n NΔmec, Steve Hay, TAKAI Kousuke, Thibault Duponchelle, Toby Inkster, Tomasz Konojacki, Tom Wyant, Tony Cook, Unicode Consortium, Yitzchak Scott-Thoennes.
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.
Like, giggling and kicking my feet at how many people showed up for this. 71 authors. SEVENTY-ONE. that's a whole group chat and then some π«Ά
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 (tell us bestie, we wanna know) π
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 <https://www.perl.org/>, the Perl Home Page.
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.
the way that "tiny but sufficient test case" is the whole assignment π like yes bestie we love a reproducible minimal repro. no giant 400-line script that "sometimes breaks", we need the β¨snack-sizedβ¨ version.
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.
π Give Thanks (yes, you can just say thank you) π
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.
not me tearing up over a command whose whole job is just... being nice π run it, it's free, it's giving gratitude era, and honestly the Porters have earned it. π«Ά
π SEE ALSO (the lore, the rabbit holes, the homework) π
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 delta, bestie β 6 parts, every flag, every bugfix, every "we fixed a thing in the regex engine" moment, all of it. π this was perl v5.44.0, dated 2026-10-17, and it's giving main character release energy π go forth and use v5.44 or whatever, ily, bye! β¨ππ¦
π¦ where this page comes from
- arch rolling: perl 5.44.0-1 Β· Artistic-1.0-Perl AND GPL-1.0-or-later
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash on : a language model's rewrite of the original, under its terms