Manage the health of your CLI tools at scale

I wrote a follow up of my previous article on dev-to. It is titled Manage the health of your CLI tools at scale and explores how you might approach instrumenting your cli tools to ensure they run properly.

Quick and dirty string dumping

Sometimes, when you're trying to debug encoding issues in Perl code, it is useful to quickly get an idea of what code points Perl thinks are in your string. The straightforward approach of say $string (or print $string) isn't a good way to look at an unknown string: The results depend on what encoding layers (if any) are set on STDOUT and how your terminal renders the resulting bytes. In some cases, "\xe2\x82\xac" (a three-character string, UTF-8 bytes) may look identical to "\x{20ac}" (a one-character string, Unicode text) when printed, for example. (And some control characters are invisible or can clear (parts of) the screen or reposition the cursor, etc.)

Data::Dumper isn't great, either: For one thing, you have to load it first and second, a naive use Data::Dumper; print Dumper($string) can still dump non-printable control characters on your terminal. You have to remember to set $Data::Dumper::Useqq = 1 first, which is a hassle (and takes another line of code).

Evolution strategy for SQL::Abstract::More : call for feedback

I am preparing a new version of SQL::Abstract::More, aimed principally at solving several long-standing bugs when param ‘quote_char’ is non-empty (i.e when the user wants to generate SQL of shape like "SELECT `Foo`.`col1`, … FROM `Foo` etc.").
While working on this I need some input from users, because the situation is a bit complicated:

575 Pull Requests in Three Weeks: What Happens When AI Meets CPAN Maintenance

On March 17th, I installed a bot called koan on my personal Claude account. It's designed to monitor your four-hour usage limits, maintain a queue of "missions," and efficiently use your credits — even while you're sleeping.

Three weeks later, I had reviewed and merged 575 pull requests across 20 CPAN repositories, cut 58 releases across 17 of them, and caught memory leaks, security holes, and long-standing bugs that nobody had gotten around to fixing in years.

Some people think that means I let an AI commit unchecked code to critical Perl infrastructure. I want to explain what actually happened.

The Numbers

Here's what those three weeks produced:

Repository PRs Merged Releases
XML-Parser958
IPC-Run683
YAML-Syck647
Net-Jabber-Bot383
Net-ACME2381
Net-Ident335
Crypt-RIPEMD160334
IO-Stty304
Razor2-Client-Agent272
Tree-MultiNode242
IO-Tty227
Business-UPS202
Test-MockFile172
Safe-Hole173
Tie-DBI151
Regexp-Parser113
Sys-Mmap91
Template26
Crypt-OpenSSL-RSA4
CDB_File4
Total57558

This week in PSC (220) | 2026-04-06

We were all present.

  • We noted that core team membership votes are concluding on this day.
  • We are waiting for voting to conclude before we kick off the discussion about an LLM policy.
  • Release blocker triage continues. We are now fully caught up and marked a few more issues as blockers – all of them minor.
  • We unmarked several issues as blockers and marked #23131 as such instead, because it was the root cause for them all. We then spent a long time deliberating what to do about it and debating approaches. We have not reached a conclusion yet and will be keeping an eye on it.

[P5P posting of this summary]

PDL in Rust -- A Native Reimplementation of the Perl Data Language

Logo.png

A few days ago, when we announced pperl's native module strategy on Reddit, someone asked about PDL support. We replied: "PDL will be supported." — to which u/fuzzmonkey35 responded: "We will live in glorious times when this happens."

Well. It happened.

We (as in: we and our AIs) reimplemented PDL (the Perl Data Language) from scratch in Rust — not a binding, not an FFI wrapper, but a ground-up reimplementation of the core engine. 15 data types, N-dimensional arrays, broadcasting, operator overloading, reductions, linear algebra, transcendental math — all in pure Rust, integrated as a native module into our pperl next-gen Perl5 platform.

use PDL;
my $a = pdl([1, 2, 3]);
my $b = pdl([10, 20, 30]);
say $a + $b;           # [11 22 33]
say ($a * $b)->sum;    # 140
say sin(pdl([0, 3.14159/2, 3.14159]));

45 tests, all green. Same Perl syntax. No XS. No C. No libpdl.

Shipping a Perl CLI as a single file with App::FatPacker

Modern software distribution has converged on a simple idea: ship a self-contained artifact. Whether that means a statically linked binary, a container image, or a snap/flatpak, the benefits are the same -- dependency management is solved at build time, platform differences are absorbed, and upgrades and rollbacks reduce to swapping a single file.

Perl's App::FatPacker applies the same principle to Perl scripts. It bundles every pure-Perl dependency into a single executable file. No cpanm, no local::lib, no Makefile on the target -- just copy the file and run it. The technique is well-established -- cpm (the CPAN installer we use in the build) is itself distributed as a fatpacked binary.

The distribution pipeline looks like this:

 Code repo --> CI --> fatpack --> deploy --> laptops / jumpboxes / servers
                      |
                single file,
                no dependencies

March articles on beautiful Perl features

Continuing the dev.to series about beautiful Perl features, here are the recent articles (March 2026) :

This week in PSC (219) | 2026-03-30

All three of us attended.

  • We discussed policy questions that were turned up by the recent submission of some LLM-generated PRs. We need to hold conversation about this among the Core team. No contributions of this kind will be accepted while the discussion is still ongoing.

  • We finally had a good chunk of time to spend on release blocker triage. We made quick progress, working through half our list and closing some issues in the process. We newly marked 4 issues as blockers.

[P5P posting of this summary]

Lingua::* - From 17 to 61 Languages: Resurrecting and Modernizing PetaMem's Number Conversion Suite

We took PetaMem's 13-year-old Lingua::* number conversion modules - dormant since 2013 with 17 languages - and brought them back to life. The suite now covers 61 languages across 7 writing systems (Latin, Cyrillic, Arabic, Devanagari, Armenian, Hebrew, CJK), including all 24 EU official languages plus Latin, Hindi, Yiddish, Mongolian, Uyghur, and more.

New in this release: cross-language numeral arithmetic with overloaded operators, ordinal support for 14 languages, capabilities introspection, and a Galois-field-based transitive test that walks the entire number space across all languages - 5000 steps, zero failures.

my $a = Lingua::Word2Num->new("zwanzig");      # German 20
my $b = Lingua::Word2Num->new("šestnáct");     # Czech 16
say ($a + $b)->as('fr');    # trente-six
say ($a + $b)->as('la');    # triginta sex

Everything on CPAN: cpanm Task::Lingua::PetaMem

PerlOnJava Gets a CPAN Client

If you’ve ever tried to run Perl code in a Java environment, you know the drill. Rewrite everything in Java (expensive, risky), or maintain two separate runtimes with all the deployment headaches.

PerlOnJava offers a third path: compile your Perl to JVM bytecode and run it anywhere Java runs. I’ve been working on Perl-to-JVM compilation, on and off, for longer than I’d like to admit. The latest push has been getting the ecosystem tooling right — and jcpan is the result.

Why This Matters

Some scenarios where this pays off:

Legacy integration. You have 50,000 lines of battle-tested Perl that process reports, transform data, or implement business logic. Rewriting it is a multi-year project with uncertain ROI. With PerlOnJava, you can deploy it as a JAR alongside your Java services.

JDBC database access. Perl’s DBI works with PerlOnJava’s JDBC backend. Connect to PostgreSQL, MySQL, Oracle, or any database with a JDBC driver — no DBD compilation required, no driver version mismatches.

Graphics::Toolkit::Color 2.0 feature overview

Finally - GTC 2.0, an all in one color library, is released ! This post will not be rehash (of) the (very) fine manual, but give you a sense what you can achieve with this software and why it is better than any other lib of that sort on CPAN. If you like to look under the hood of GTC, please read my last post.

28th German Perl Workshop (2026, Berlin)

Cross-posted from my blog

Last week, the Perl community came together for the 28th German Perl Workshop. This year, it was held at the Heilandskirche in Berlin Moabit. Excitingly, we had the nave for the presentations.

PXL_20260316_073151275.RAW-01.COVER-small.jpg

While the name is still German Perl Workshop, we now draw attendees from all over the globe. Presenters came from India, the US and various European countries. Maybe it is time to announce it as a more international conference again.

ANNOUNCE: Perl.Wiki V 1.42 & 2 CPAN::Meta* modules

Available now from my Wiki Haven: Perl.Wiki.html V 1.42 & the JSTree version.

Also, I've uploaded to CPAN 2 modules:

1: CPAN::MetaCurator V 1.13

2: CPAN::MetaPackager V 1.00

Q & A:

1: What is the relationship between these 2 modules?
CPAN::MetaPackager's scripts/build.db.sh inputs
a recent version of the Perl file 02packages.details.txt,
and outputs an SQLite file called cpan.metapackager.sqlite (15Mb).
The latter ships with the module.

Future versions of this module will use the differences between the db
and newer versions of 02packages.details.txt to do the usual thing of
add/change/delete entries in cpan.metapackager.sqlite.

2: CPAN::MetaCurator's scripts/build.db.sh inputs
an JSON export from Perl.Wiki.html called tiddlers.json,
and outputs an SQLite file called cpan.metacurator.sqlite (15Mb).
The latter ships with the module.

Then scripts/export.tree.sh outputs a file called cpan.metacurator.tree.html.
This latter file is a JSTree version of Perl.Wiki.html, as mentioned above.

Note: By setting the env var INCLUDE_PACKAGES to 1 before you run export.tree.sh
the code will read the cpan.metapackager.sqlite table 'packages' and that changes
the output tree a bit, since the code then knows the names of modules released
to CPAN.

perlmodules.net is back up

On Jan 10th I had said in a post here, that perlmodules.net 's update (to use the new metacpan API) would take 1-2 weeks.

It took 1-2 months. (two in fact)

Now it's up again.

Sorry.

Huge congrats goes to Olaf A. for fixing my code.

Bye.

Note to perlmodules.net's users: Since you must have gotten a ton of emails from the website today regarding all the CPAN module releases that have occurred in the past 2 months, you are advised to check also your spam folder, since some of the emails might have ended there by your mail provider (it might have misinterpreted the deluge of incoming mails as spam). Please move them from the Spam folder to your inbox if you can, to prevent perlmodules.net from being blacklisted as a spammer (not 100% sure that's how blacklisting works, but anyway). Thanks.

Foswiki 2.1.11 is released

FoswikisLatest_23.png Foswiki 2.1.11 is now available to be downloaded . This release came earlier than expected due to the severe security issues found in previous versions, as detailed in CVE-2026-2861. Thanks goes to Jan Seebens of Telekom Germany for finding the initial issue. While investigating the vulnerability, a few more were found that followed similar patterns in the cpde. Please note that some long-deprecated endpoints have been removed in order to reduce the vulnerable surface area. See the release notes for additional information.

Dancer 2.1.0 Released

We're thrilled to announce the release of Dancer2 2.1.0! This release represents a major investment in the health and quality of the project. We've gone deep into the issue tracker and PR backlog, closing out some of our oldest open issues — some dating back years — and significantly grooming both the issue and pull request queues. A big thank you to everyone who contributed.

Bug Fixes

This release addresses a number of long-standing issues:

ANNOUNCE: Perl.Wiki & JSTree V 1.41, etc

Updated wikis are available now from my Wiki Haven :
  • Perl Wiki & JSTree style V 1.41
  • CSS and Javascript Wiki V 1.03
  • Debian Wiki V 1.12
  • Digital Security Wiki V 1.21
  • Mojolicious Wiki V 1.15
  • Symbolic Language Wiki V 1.19
And see the 'News flash: 7 Mar 2026' for why Symbolic.Language.Wiki is now on savage.net.au.

Cloud VM Performance / Price comparison 2026

If you are using Cloud VMs you might want to check out a CPU performance and price comparison across 7 providers, 44 VM families.

The main benchmark suite used was the Perl-based (Benchmark::DKbench). If you want to try it out yourself, on a machine with docker just run:

docker run -it --rm dkechag/dkbench

Websockets in Catalyst

Recently I've heard quite a few people comment about how Catalyst can't do websockets. I'm writing this article to dispel that myth, and document how you can retro-fit websockets into an existing Catalyst application in a materially useful way, and without rewriting any of your existing code. I'll also show a case where it actually makes sense to do this rather than using a framework designed for that purpose.

(this article has been updated to use Request->io_fh, which is Catalyst's official escape-hatch for supporting websockets and comet polling. Also the earlier version omitted the 'begin' action)

Backstory

About blogs.perl.org

blogs.perl.org is a common blogging platform for the Perl community. Written in Perl with a graphic design donated by Six Apart, Ltd.