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_strnlenhas been sped up for systems that don't have their ownstrnlenimplementation π₯grok_bin_oct_hex(and so,grok_bin,grok_oct, andgrok_hex) have been sped up β‘grok_number_flagshas been sped up π¨sortis now noticeably faster in cases such assort {$a <=> $b}orsort {$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 from2.32to2.36β¨autodieβ glow-up from2.29to2.32β¨Bβ glow-up from1.76to1.80β¨B::Deparseβ glow-up from1.49to1.54β¨Benchmarkβ glow-up from1.22to1.23β¨charnamesβ glow-up from1.45to1.48β¨Class::Structβ glow-up from0.65to0.66β¨Compress::Raw::Bzip2β glow-up from2.084to2.093β¨Compress::Raw::Zlibβ glow-up from2.084to2.093β¨CPANβ glow-up from2.22to2.27β¨DB_Fileβ glow-up from1.843to1.853β¨Devel::PPPortβ glow-up from3.52to3.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 from1.36to1.37β¨Digest::MD5β glow-up from2.55to2.55_01β¨Dumpvalueβ glow-up from1.18to1.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 from1.45to1.47β¨Encodeβ glow-up from3.01to3.06β¨encodingβ glow-up from2.22to3.00β¨Englishβ glow-up from1.10to1.11β¨Exporterβ glow-up from5.73to5.74β¨ExtUtils::CBuilderβ glow-up from0.280231to0.280234β¨ExtUtils::MakeMakerβ glow-up from7.34to7.44β¨featureβ glow-up from1.54to1.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 from1.36to1.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 from1.32to1.33β¨File::statβ glow-up from1.08to1.09β¨Filter::Simpleβ glow-up from0.95to0.96β¨Getopt::Longβ glow-up from2.5to2.51β¨Hash::Utilβ glow-up from0.22to0.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 from0.18to0.19β¨I18N::LangTagsβ glow-up from0.43to0.44β¨
now documents the "IGNORE_WIN32_LOCALE" environment variable. write that down bestie π
IOβ glow-up from1.40to1.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 from2.084to2.093β¨IPC::Cmdβ glow-up from1.02to1.04β¨IPC::Open3β glow-up from1.20to1.21β¨JSON::PPβ glow-up from4.02to4.04β¨Math::BigIntβ glow-up from1.999816to1.999818β¨Math::BigInt::FastCalcβ glow-up from0.5008to0.5009β¨Module::CoreListβ glow-up from5.20190522to5.20200620β¨Module::Load::Conditionalβ glow-up from0.68to0.70β¨Module::Metadataβ glow-up from1.000036to1.000037β¨mroβ glow-up from1.22to1.23β¨Net::Pingβ glow-up from2.71to2.72β¨Opcodeβ glow-up from1.43to1.47β¨openβ glow-up from1.11to1.12β¨overloadβ glow-up from1.30to1.31β¨parentβ glow-up from0.237to0.238β¨perlfaqβ glow-up from5.20190126to5.20200523β¨PerlIOβ glow-up from1.10to1.11β¨PerlIO::encodingβ glow-up from0.27to0.28β¨PerlIO::viaβ glow-up from0.17to0.18β¨Pod::Htmlβ glow-up from1.24to1.25β¨Pod::Simpleβ glow-up from3.35to3.40β¨podlatorsβ glow-up from4.11to4.14β¨POSIXβ glow-up from1.88to1.94β¨reβ glow-up from0.37to0.40β¨Safeβ glow-up from2.40to2.41β¨Scalar::Utilβ glow-up from1.50to1.55β¨SelfLoaderβ glow-up from1.25to1.26β¨Socketβ glow-up from2.027to2.029β¨Storableβ glow-up from3.15to3.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 from1.22to1.23β¨Sys::Syslogβ glow-up from0.35to0.36β¨Term::ANSIColorβ glow-up from4.06to5.01β¨Test::Simpleβ glow-up from1.302162to1.302175β¨Threadβ glow-up from3.04to3.05β¨Thread::Queueβ glow-up from3.13to3.14β¨threadsβ glow-up from2.22to2.25β¨threads::sharedβ glow-up from1.60to1.61β¨Tie::Fileβ glow-up from1.02to1.06β¨Tie::Hash::NamedCaptureβ glow-up from0.10to0.13β¨Tie::Scalarβ glow-up from1.04to1.05β¨Tie::StdHandleβ glow-up from4.5to4.6β¨Time::HiResβ glow-up from1.9760to1.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 from1.33to1.3401β¨Unicode::Normalizeβ glow-up from1.26to1.27β¨Unicode::UCDβ glow-up from0.72to0.75β¨VMS::Stdioβ glow-up from2.44to2.45β¨warningsβ glow-up from1.44to1.47β¨Win32β glow-up from0.52to0.53β¨Win32API::Fileβ glow-up from0.1203to0.1203_01β¨XS::APItestβ glow-up from1.00to1.09β¨
π₯ Removed Modules and Pragmata π₯
Pod::Parserhas 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
BOUNDandNBOUNDdefinitions. 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_2pvbyteupdated to mention it will croak if the SV cannot be downgraded. yes bestie it WILL throw hands.sv_setpvnupdated to mention that the UTF-8 flag will not be changed by this function, and a terminating NUL byte is guaranteed.- Documentation for
PL_phasehas been added. she finally got her own page π - The documentation for
grok_bin,grok_oct, andgrok_hexhas 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 fromdo 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 systemmallocis 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.fncnow 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 apidoclines.
π perlhacktips
- The differences between Perl strings and C strings are now detailed. lowkey important, highkey underrated.
π perlintro
- The documentation for the repetition operator
xhave been clarified. [GH #17335 βhttps://github.com/Perl/perl5/issues/17335]
π perlipc
- The documentation surrounding
openand 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
-wwithuse 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
- Update
timegmexample to use the correct year format1970instead of70. [GH #16431 βhttps://github.com/Perl/perl5/issues/16431]
π 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
libffifor simple library bindings via CPAN modules like FFI::Platypus or FFI::Raw.
π POSIX
setlocalewarning 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:
π Updating of links
- Links to the now defunct
https://search.cpan.orgsite now point at the equivalenthttps://metacpan.orgURL. [GH #17393 βhttps://github.com/Perl/perl5/issues/17393] - The man page for ExtUtils::XSSymSet is now only installed on VMS, which is the only platform the module is installed on. [GH #17424 β
https://github.com/Perl/perl5/issues/17424] - URLs have been changed to
https://and stale links have been updated.
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::Baseupgrade.
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 satisfyclang++, 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 asgcc-1and 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 π§Ή
- The
"ECHO"macro is now defined. It's used in a"dtrace"rule that was originally changed for FreeBSD, and the FreeBSD make apparently predefines it. Solaris make does not predefine"ECHO", which broke that rule on Solaris. [GH #17057](https://github.com/Perl/perl5/issues/17057) https://github.com/Perl/perl5/issues/17057 - Bison versions 3.1 through 3.4 are now supported. π
π§ͺ 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.tno longer uses (and re-uses) thetmpinplace/directory undert/. 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.tcould 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'slenparameter is now aSize_tinstead of anI32, because we can handle longer strings than 31 bits, bestie π- The lexer (
Perl_yylex()intoke.c) was previously a single 4100-line function, relying heavily ongotoand 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 singleswitchstatement, all of whosecasegroups 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 commitv5.31.5-346-g116e19abbffor 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 aNULcharacter. 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_cxsubixfield. This records the stack index of the most recently pushed sub/format/eval context. It is set and restored automatically bycx_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 whileuse feature 'signatures'is in effect. This allows custom keywords to implement semantics similar to regularsubdeclarations 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_NEEDEDandWITH_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_LEVELenvironment variable was formerly only honoured on perl binaries built withDEBUGGINGsupport. 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 aG_RETHROWflag. If this flag is set and an exception is thrown while compiling or executing the supplied code, it will be rethrown, andeval_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 ifexit(0)is called in aBEGIN,UNITCHECKorCHECKblock. 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_undefas a value in%INCthat meant "a previousrequirefailed" β but any other undefined SV got treated like the previousrequiresucceeded. Which is chaos. It could makerequireunexpectedly succeed, like onlocal %INC = %INC;. Fixed now. [GH #17428](https://github.com/Perl/perl5/issues/17428) π (?{...})eval groups in regexes no longer accidentally triggerEVAL 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
-Droruse rewith 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.cafterB::UNOP_AUX::aux_list(). [GH #17301](https://github.com/Perl/perl5/issues/17301) - Loading
IOis 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.
- Properly handle filled
/ilregnodes and multi-char folds. π₯ - Compilation error during
make minitest. [GH #17293](https://github.com/Perl/perl5/issues/17293) - Moved the implementation of
%-and%+into core. - Read beyond buffer in
grok_inf_nan. [GH #17370](https://github.com/Perl/perl5/issues/17370) π - Workaround for a glibc bug with
LC_MESSAGES. [GH #17081](https://github.com/Perl/perl5/issues/17081) printf()orsprintf()with the%nformat could cause a panic on debugging builds, or report an incorrectly cached length value when producingSVfUTF8flagged strings. [GH #17221](https://github.com/Perl/perl5/issues/17221) π- The tokenizer has been extensively refactored. big glow-up energy. [GH #17241](https://github.com/Perl/perl5/issues/17241) [GH #17189](https://github.com/Perl/perl5/issues/17189)
use strict "subs"is now enforced for bareword constants optimized into amulticoncatoperator. [GH #17254](https://github.com/Perl/perl5/issues/17254)- A memory leak in regular expression patterns has been fixed. [GH #17218](https://github.com/Perl/perl5/issues/17218) π«Ά
- Perl no longer treats strings starting with
0xor0bas hex or binary numbers respectively when converting a string to a number. This reverts a change in behaviour that was inadvertently introduced in perl 5.30.0, which was intended to improve precision when converting a string to a floating point number. oopsie. [GH #17062](https://github.com/Perl/perl5/issues/17062) - Matching a non-
SVf_UTF8string against a regular expression containing Unicode literals could leak an SV on every single match attempt. [GH #17140](https://github.com/Perl/perl5/issues/17140) - Overloads for octal and binary floating point literals were always passed a string with a
0xprefix instead of the appropriate0or[GH #14791]|https://github.com/Perl/perl5/issues/14791"] $@ = 100; die;now correctly propagates the100as an exception instead of just ignoring it. [GH #17098](https://github.com/Perl/perl5/issues/17098) π[GH #17108]|https://github.com/Perl/perl5/issues/17108"]- Exceptions thrown while
$@is read-only could result in infinite recursion, because perl would try to update$@, which throws another exception, which means a stack overflow. yikes bestie π Perl now replaces$@with a copy if it's not a simple writable SV. [GH #17083](https://github.com/Perl/perl5/issues/17083) - Setting
$)now properly sets supplementary group ids, assuming you have the necessary privileges. [GH #17031](https://github.com/Perl/perl5/issues/17031) close()on a pipe now preemptively clears the PerlIO object from the IO SV. This stops a second attempt to close the already-closed PerlIO object if a signal handler callsdie()orexit()whileclose()is waiting for the child process to finish. [GH #13929](https://github.com/Perl/perl5/issues/13929)sprintf("%.*a", -10000, $x)would cause a buffer overflow because it mishandled the negative precision value. [GH #16942](https://github.com/Perl/perl5/issues/16942)scalar()on a reference could cause an erroneous assertion failure during compilation. [GH #16969](https://github.com/Perl/perl5/issues/16969)%{^CAPTURE_ALL}is now an alias to%-as documented, rather than incorrectly an alias for[GH #16105]|https://github.com/Perl/perl5/issues/16105"]%{^CAPTURE}didn't work if@{^CAPTURE}was mentioned first. Same deal for%{^CAPTURE_ALL}and@{^CAPTURE_ALL}, though.[GH #17045]|https://github.com/Perl/perl5/issues/17045"]- Extraordinarily large (over 2GB) floating point format widths could cause an integer overflow in the underlying call to
snprintf(), resulting in an assertion. Formatted floating point widths are now limited to the range ofint, the return value ofsnprintf(). [#16881](https://github.com/Perl/perl5/issues/16881) - Parsing the following constructs within a sub-parse (like with
${code here}ors/.../code here/e) has changed to match how they're parsed normally:print $fh ...no longer produces a syntax error.- Code like
s/.../ ${time} /enow properly produces anAmbiguous use of ${time} resolved to $time at ...warning when warnings are enabled. @x {"a"}(with the space) in a sub-parse now properly produces a "better written as" warning when warnings are enabled.- Attributes can now be used in a sub-parse. [GH #16847](https://github.com/Perl/perl5/issues/16847)
- Incomplete hex and binary literals like
0xand0bare now treated as if thexorbis part of the next token. [#17010](https://github.com/Perl/perl5/issues/17010) - A spurious
)in a subparse, like ins/.../code here/eor...${code here}, no longer confuses the parser. π
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)
- Reference assignment of a sub, such as
\&foo = \&bar;, silently did nothing in the[GH #16987]|https://github.com/Perl/perl5/issues/16987"] sv_gets()now recovers better if the target SV is modified by a signal handler. [GH #16960](https://github.com/Perl/perl5/issues/16960)readline @foonow evaluates@fooin scalar context. Before, it would be evaluated in list context, and sincereadline()pops only one argument from the stack, the stack could underflow, or be left with unexpected values sitting on the stack. [GH #16929](https://github.com/Perl/perl5/issues/16929)- Parsing incomplete hex or binary literals was changed in 5.31.1 to treat such a literal as just the
0, leaving the followingxorbto be parsed as part of the next token. That could lead to some silent changes in behaviour, so now incomplete hex or binary literals produce a fatal error. [GH #17010](https://github.com/Perl/perl5/issues/17010) π¨ eval_pv()'scroak_on_errorflag will now throw even if the exception is a false overloaded value. [GH #17036](https://github.com/Perl/perl5/issues/17036)INITblocks and the program itself are no longer run ifexit(0)is called within aBEGIN,UNITCHECKorCHECKblock. [GH #1537](https://github.com/Perl/perl5/issues/1537)open my $fh, ">>+", undefnow opens the temporary file in append mode: writes will seek to the end of file before writing. [GH #17058](https://github.com/Perl/perl5/issues/17058)- Fixed a SEGV when searching for the source of an uninitialized value warning on an op whose subtree includes an
OP_MULTIDEREF. [GH #17088](https://github.com/Perl/perl5/issues/17088)
ποΈ 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
Changesfile for an explanation of how to view exhaustive details on what changed. - The
INSTALLfile for how to build Perl. - The
READMEfile for general stuff. - The
ArtisticandCopyingfiles 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
- fedora 43: perl-doc 5.42.3-524.fc43 Β· (GPL-1.0-or-later OR Artistic-1.0-Perl) AND Unicode-3.0 AND LicenseRef-Fedora-UltraPermissive
- fedora 44: perl-doc 5.42.3-525.fc44 Β· (GPL-1.0-or-later OR Artistic-1.0-Perl) AND Unicode-3.0 AND LicenseRef-Fedora-UltraPermissive
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash on : a language model's rewrite of the original, under its terms