pperl 0.6.20#

2026-09-27, 21 commits.

  • Static binaries start again. Every statically linked (musl) pperl stopped with a segmentation fault before running a line: the code that records the program’s arguments, which an assignment to $0 rewrites, received none from musl and read garbage. They also build again: POSIX’s six locale categories that only glibc defines (LC_ADDRESS, LC_IDENTIFICATION, LC_MEASUREMENT, LC_NAME, LC_PAPER, LC_TELEPHONE) are reported on musl as perl5 built on musl reports them, “Your vendor has not defined POSIX macro”.

  • Peta::Dict no longer crashes in a compiled loop that counts numeric-string keys, such as for my $k (@keys) { $h{$k}++ }. A key that grew the table during the loop left the compiled code reading the table’s freed memory.

  • Regular expressions compiled by ReJIT search each string once instead of twice. Regex-redux runs 9% fewer instructions; scans for a long literal and for a pattern that starts with . take about half and under a third of the cycles they took. No measured pattern got slower.

  • Release archives: every binary of a release is built with profile-guided optimisation, and a release is one archive holding the binaries, their SHA-256 sums and a build record (commit, target, features). Before it is packed, each binary must print the locale and format numbers under four locale settings exactly as perl5 built against the same C library does.