How do I connect to mysql using perl on Xampp?

Perl questions on StackOverflow

Published by user25154693 on Tuesday 21 May 2024 01:39

When I run the following Perl script on the xampp (for windows 11) command prompt:

print "Content-type: text/html\n\n";
use strict;
use warnings;
use DBI;
my $db = DBI->connect("DBI:mysql:database=count", "root", "");
die "failure" unless($db);
print "connected";

I get the following error:

install_driver(mysql) failed: Can't load 'C:/xampp/perl/vendor/lib/auto/DBD/mysql/mysql.xs.dll' for module DBD::mysql: load_file:The specified module could not be found at C:/xampp/perl/lib/ line 193. at (eval 6) line 3. Compilation failed in require at (eval 6) line 3. Perhaps a required shared library or dll isn't installed where expected at line 6.

mysql.xs.dll is at the indicated location.

I am assigning a variable to the first element of a list.

If I make the assignment inside an if statement, I get a different value than if I assign it outside the statement.

Like this:

$ perl -E 'my @y = (0, 1) ;  my $ x; if (($x) = @y) {say qq[yes ], $x} else {say q[no ], $x}'
yes 0


$ perl -E 'my @y = (0, 1) ; my ($x) = @y; if ($x) {say qq[yes ], $x} else {say q[no ], $x}'
no 0

Why are the results different?

Is there a way to make the assignment inside the if statement and check its value?

Perl Weekly #669 - How Time Machine works #perl

Published by Gabor Szabo on Monday 20 May 2024 09:02

Originally published at Perl Weekly 669

Hi there!

Last week Mohammed wrote that he can't wait to test out perl 5.40. In response Michiel Beijen wrote a blog post explaining how you can already try 5.39.10, using plenv. I love this!

As you might know a while ago I stopped using mailman for the Perl Weekly and now both the subscription and unsubscription process is done by sending me an email that I read and process manually. This gives an excellent opportunity to the new subscribers to introduce themselves and even to mention the subjects that are interested in.

As the Perl Weekly is a news aggregator I am going to share some of the items in his mail hoping that some of you will write blog posts covering some of the issues.

After a long break from Perl, I'm looking for best current practice on building a website for a cycling club. So I'm curious about the full stack (for collaborative dev, integration, and public deployment) the architecture (MVC (Dancer2 or Mojolicious) & DB), and frameworks for Plack/PSGI, JavaScript, unit and acceptance testing, and OO, for example.
Also, what collaborative tools to use for Scrum/Kanban collaboration, and source control, CI and CD.
To start with, I am hunting around for best practice on a dev Webserver and client, and, later, a public web hosting server.

This was my response: To respond to your questions: I personally was using Dancer a lot, but Mojolicious seems to have slightly more development activity.
For CI I use either GitHub Actions or GitLab pipelines depending on which git hosting service the project uses.
I rent a server at Linode, but I have converted many of my sites to be static using some Static Site Generator and then I host them on GitHub pages.

I hope you'll have more detailed answer.

Actually, in this edition we have a post by Dave Cross on Deploying Dancer Apps already responding to part of the questions. This is how time-machine works.

Have a nice week!

Your editor: Gabor Szabo.


How to try the newest Perl version easily

Collaborators needed for bring full OpenAI support to Perl

Deploying Dancer Apps

For people who would like to write and deploy a small (or big?) web application.

MariaDB 10 and SQL::Translator::Parser

Perl Toolchain Summit 2024 - Lisbon Portugal

Confirming The LPW 2024 Venue & Date

When: Saturday 26th October 2024; Where: The Trampery, 239 Old Street, London EC1V 9EY


This week in PSC (148)

The Weekly Challenge

The Weekly Challenge by Mohammad Sajid Anwar will help you step out of your comfort-zone. We pick one champion at the end of the month from among all of the contributors during the month.

The Weekly Challenge - 270

Welcome to a new week with a couple of fun tasks "Special Positions" and "Equalize Array". If you are new to the weekly challenge then why not join us and have fun every week. For more information, please read the FAQ.

RECAP - The Weekly Challenge - 269

Enjoy a quick recap of last week's contributions by Team PWC dealing with the "Bitwise OR" and "Distribute Elements" tasks in Perl and Raku. You will find plenty of solutions to keep you busy.

Distribute Or...

Raku never misses the opportunity to surprise me, Reduction Metaoperator with Binary OR [+|]. Raku Rocks !!

Two of Us Distributing Elements

Interactive discussion on every little things in details, likely to keep you engaged all the way. Thanks for sharing.

Bits and Bins

A complete re-structure of the original task and still managed to get the job done. This is truly exceptional.

Perl Weekly Challenge 269: Bitwise OR

Another cool dissection of the original task, it is always fun to read the post going into finer details. Keep it up great work.

Perl Weekly Challenge 269: Distribute Elements

Quick and simple implementation in both Perl and Raku. Enjoy the comparative analysis too.

Perl Weekly Challenge 269

Exceptional one-liner in Perl by our own master of one-liner. Keep it up great work.

at the last time I did!

One place where you get to enjoy the four different aspects through Raku, Python, Java and PostgreSQL. Well done and keep it up.

Bitwise Distribution

Well documented and with detailed narration to keep you busy. The bonus is Elixir on top. Thank you for everything.

Bits distribution

DIY Tool as always with engaging discussion. Highly recommended.

The Weekly Challenge #269

Classic one-liner in Perl, discussion makes it smooth ride. Thanks for sharing.

The Bitwise Elements

One-liner in Raku and Lua solution found space in the post too. My personal favourite is the PostScript, you really don't want to skip it.

Elements or something

Python solution is always lucky to get the limelight. I really enjoy the compact solution. Thanks for sharing.

Weekly collections

NICEPERL's lists

Great CPAN modules released last week.

You joined the Perl Weekly to get weekly e-mails about the Perl programming language and related topics.

Want to see more? See the archives of all the issues.

Not yet subscribed to the newsletter? Join us free of charge!

(C) Copyright Gabor Szabo
The articles are copyright the respective authors.

Collaborators needed for bring full OpenAI support to Perl


Published by /u/OvidPerl on Monday 20 May 2024 07:57

Hi all,

Nelson Ferraz has been working with generative AI for a while. I've started collaborating with him on his OpenAI modules. He wrote a module named OpenAI::API, but it required manually writing the code for all of the behavior. With the size of the OpenAI API, its rapid evolution, the birth of new models and the deprecation of old ones, this approach turned out to be unmaintainable.

Thus, that module was deprecated in favor of Nelson's OpenAPI::Client::OpenAI module. Throw the 13K+ lines OpenAPI spec for OpenAI at it and it just works. Further, the module is pretty much a single Perl class rather than a bunch of hand-crafted code.

CPAN authors know it can be hard to keep modules up-to-date (mea culpa, mea culpa!) and this module is no exception. I need this module so I offered to collaborate and created a PR to update it to version 2.0.0 of the OpenAI spec. It now passes all the tests (for those wondering, you need an OpenAI key and it costs $0.04 USD to run the test suite).

In trying to build a Whisper pipeline for that, I found that I couldn't. There was a PR for Whisper support for the older module, but for the newer one, I can't figure out how to get it to issue a request with multipart/form-data support. I've noted the issue in the PR.

If anyone would like to see OpenAI support for Perl, we would dearly love to collaborate with you to make this happen.

Edit: Let's not discuss that delightful typo in the title. I rewrote the title too quickly.

submitted by /u/OvidPerl
[link] [comments]

The Weekly Challenge - Perl & Raku

The Weekly Challenge

Published on Monday 20 May 2024 04:27

The page you are looking for was moved, removed, renamed or might never existed.


The Weekly Challenge

Published on Monday 20 May 2024 04:27

TABLE OF CONTENTS 01. HEADLINES 02. STAR CONTRIBUTORS 03. CONTRIBUTION STATS 04. GUESTS 05. LANGUAGES 06. CENTURION CLUB 07. DAMIAN CONWAY’s CORNER 08. ANDREW SHITOV’s CORNER 09. PERL SOLUTIONS 10. RAKU SOLUTIONS 11. PERL & RAKU SOLUTIONS HEADLINES Thank you Team PWC for your continuous support and encouragement. STAR CONTRIBUTORS Following members shared solutions to both tasks in Perl and Raku as well as blogged about it.


The Weekly Challenge

Published on Monday 20 May 2024 04:27

TABLE OF CONTENTS 01. HEADLINES 02. STAR CONTRIBUTORS 03. CONTRIBUTION STATS 04. GUESTS 05. LANGUAGES 06. CENTURION CLUB 07. DAMIAN CONWAY’s CORNER 08. ANDREW SHITOV’s CORNER 09. PERL SOLUTIONS 10. RAKU SOLUTIONS 11. PERL & RAKU SOLUTIONS HEADLINES Thank you Team PWC for your continuous support and encouragement. STAR CONTRIBUTORS Following members shared solutions to both tasks in Perl and Raku as well as blogged about it.


The Weekly Challenge

Published on Monday 20 May 2024 04:27

TABLE OF CONTENTS 01. HEADLINES 02. STAR CONTRIBUTORS 03. CONTRIBUTION STATS 04. GUESTS 05. LANGUAGES 06. CENTURION CLUB 07. DAMIAN CONWAY’s CORNER 08. ANDREW SHITOV’s CORNER 09. PERL SOLUTIONS 10. RAKU SOLUTIONS 11. PERL & RAKU SOLUTIONS HEADLINES Thank you Team PWC for your continuous support and encouragement. STAR CONTRIBUTORS Following members shared solutions to both tasks in Perl and Raku as well as blogged about it.

BLOG: The Weekly Challenge #053

The Weekly Challenge

Published on Monday 20 May 2024 04:27

I noticed now a days, I go for solution with unit test. I will give the credit to fellow Team PWC member, E. Choroba. It feels great when you see the test pass at the end. Well the solution looks little different than just standalone solution. For that reason, I decided to do both for Raku solutions. Also this allowed me to explore unit testing in Raku.

makeinfo can't locate Texinfo/

Perl questions on StackOverflow

Published by invalidsyntax_ on Sunday 19 May 2024 20:28

The makeinfo command under the Texinfo toolchain gives the following error:

Can't locate Texinfo/ in @INC (you may need to install the Texinfo::ModulePath module) (@INC entries checked: /usr/share/texinfo /usr/lib/perl5/5.38/site_perl /usr/share/perl5/site_perl /usr/lib/perl5/5.38/vendor_perl /usr/share/perl5/vendor_perl /usr/lib/perl5/5.38/core_perl /usr/share/perl5/core_perl) at /usr/bin/makeinfo line 111.
BEGIN failed--compilation aborted at /usr/bin/makeinfo line 115.

How can I install this module or another way to remove this error message? Tried installing Texinfo::ModulePath on cpan, it's not a package there. This is on Arch Linux. Thanks.

Deploying Dancer Apps - Perl Hacks


Published by /u/davorg on Sunday 19 May 2024 17:46

Deploying Dancer Apps

Perl Hacks

Published by Dave Cross on Sunday 19 May 2024 17:39

Over the last week or so, as a background task, I’ve been moving domains from an old server to a newer and rather cheaper server. As part of this work, I’ve been standardising the way I deploy web apps on the new server and I thought it might be interesting to share the approach I’m using and talking about a couple of CPAN modules that are making my life easier.

As an example, let’s take my Klortho app. It dispenses useful (but random) programming advice. It’s a Dancer2 app that I wrote many years ago and have been lightly poking at occasionally since then. The code is on GitHub and it’s currently running at It’s a simple app that doesn’t need a database, a cache or anything other than the Perl code.

Dancer apps are all built on PSGI, so they have all of the deployment flexibility you get with any PSGI app. You can take exactly the same code and run it as a CGI program, a mod_perl handler, a FastCGI program or as a stand-alone service running behind a proxy server. That last option is my favourite, so that’s what I’ll be talking about here.

Starting a service daemon for a PSGI app is simple enough – just running “plackup app.psgi” is all you really need. But you probably won’t get a particularly useful service daemon out of that. For example, you’ll probably get a non-forking server that will only respond to a single request at a time. It’ll be good enough for testing, but you’ll want something more robust for production. So you’ll want to tell “plackup” to use Starman or something like that.  And you’ll want other options to tell the service which port to run on. You’ll end up with a quite complex start-up command line to start the server. So, if you’re anything like me, you’ll put that all in a script which gets added to the code repo.

But it’s still all a bit amateur. Linux has a flexible and sophisticated framework for starting and stopping service daemons. We should probably look into using that instead. And that’s where my first module recommendation comes into play – Daemon::Control. Daemon::Control makes it easy to create service daemon control scripts that fit in with the standard Linux way of doing things. For example, my Klortho repo contains a file called klortho_service which looks like this:

#!/usr/bin/env perl

use warnings;
use strict;
use Daemon::Control;

use ENV::Util -load_dotenv;
use Cwd qw(abs_path);
use File::Basename;
  name      => ucfirst lc $ENV{KLORTHO_APP_NAME},
  lsb_start => '$syslog $remote_fs',
  lsb_stop  => '$syslog',
  lsb_sdesc => 'Advice from Klortho',
  lsb_desc  => 'Klortho knows programming. Listen to Klortho',
  path      => abs_path($0),
  program      => '/usr/bin/starman',
  program_args => [ '--workers', 10, '-l', ":$ENV{KLORTHO_APP_PORT}",
                    dirname(abs_path($0)) . '/app.psgi' ],
  user  => $ENV{KLORTHO_OWNER},
  group => $ENV{KLORTHO_GROUP},
  pid_file    => "/var/run/$ENV{KLORTHO_APP_NAME}.pid",
  stderr_file => "$ENV{KLORTHO_LOG_DIR}/error.log",
  stdout_file => "$ENV{KLORTHO_LOG_DIR}/output.log",
  fork => 2,

This code takes my hacked-together service start script and raises it to another level. We now have a program that works the same way as other daemon control programs like “apachectl” that you might have used. It takes command line arguments, so you can start and stop the service (with “klortho_service start”, “klortho_service stop” and “klortho_service restart”) and query whether or not the service is running with “klortho_service status”. There are several other options, which you can see with “klortho_service status”. Notice that it also writes the daemon’s output (including errors) to files under the standard Linux logs directory. Redirecting those to a more modern logging system is a task for another day.

Actually, thinking about it, this is all like the old “System V” service management system. I should see if there’s a replacement that works with “systemd” instead.

And if you look at line 7 in the code above, you’ll see the other CPAN module that’s currently making my life a lot easier – ENV::Util. This is a module that makes it easy to work with “dotenv” files. If you haven’t come across “dotenv” files, here’s a brief explanation – they’re files that are tied to your deployment environments (development, staging, production, etc.) and they contain definitions of environment variables which are used to control how your software acts in the different environments. For example, you’ll almost certainly want to connect to a different database instance in your different environments, so you would have a different “dotenv” file in each environment which defines the connection parameters for the appropriate database in that environment. As you need different values in different environments (and, also, because you’ll probably want sensitive information like passwords in the file) you don’t want to store your “dotenv” files in your source code control. But it’s common to add a file (called something like “.env.sample”) which contains a list of the required environment variables along with sample values.

My Klortho program doesn’t have a database. But it does need a few environment variables. Here’s its “.env.sample” file:

export KLORTHO_APP_NAME=klortho
export KLORTHO_OWNER=someone
export KLORTHO_GROUP=somegroup
export KLORTHO_APP_PORT=9999

And near the top of my service daemon control program, you’ll see the line:

use ENV::Util -load_dotenv;

That looks to see if there’s a “.env” file in the current directory and, if it finds one, it is loaded and the contents are inserted in the “%ENV” hash – from where they can be accessed by the rest of the code.

There’s one piece of the process missing. It’s nothing clever. I just need to generate a configuration file so the proxy server (I use “nginx”) reroutes requests to so that they’re processed by the daemon running on whatever port is configured in “KLORTHO_APP_PORT”. But “nginx” configuration is pretty well-understood and I’ll leave that as an exercise for the reader (but feel free to get in touch if you need any help).

So that’s how it works. I have about half a dozen Dancer2 apps running on my new server using this layout. And knowing that I have standardised service daemon control scripts and “dotenv” files makes looking after them all far larger.

And before anyone mentions it, yes, I should rewrite them so they’re all Docker images. That’s a work in progress. And I should run them on some serverless system. I know my systems are completely up to date. But we’re getting there.

If you have any suggestions for improvement, please let me know.

The post Deploying Dancer Apps first appeared on Perl Hacks.

World Uncovered is cool

rjbs forgot what he was saying

Published by Ricardo Signes on Sunday 19 May 2024 12:00

Years ago, I found an iOS app called World Uncovered. I used it for a while, then forgot about it, then started using it again. It’s pretty cool, and I keep telling people about it, so I thought I’d write a post about it.

It’s like this: you let it track your movements the same way that a fitness app like RunKeeper would, and instead of telling you how many steps you’re getting in, it tells you where you’ve ever walked, ever. Keeping in mind that I sometimes have it turned off, and forgot about it for years, check out my map for Philadelphia:

Philly Uncovered

Sometimes I joke with my coworkers that I have never been to West Philadelphia. It’s not true, but… I mean, you can see my usual stomping grounds. You can also see the little excursions up toward Bethlehem, off to Camden, and down… well, I don’t know what I was doing down in South Philly, but that little diagonal below the Italian Market is definitely representative of a few trips to Milk Jawn.

Like I said, I’d forgotten all about the app until February, when I was in Vienna for a few days. For some reason I was flipping through my phone’s screens and saw it and thought, “I should log this trip!” It was great fun, and it made me realize all the trips I had failed to log for the past few years: Norway, Brussels, England, Australia, and others. I like to see new places, and these little marked-up maps are a fun memento. Here’s Vienna:

Vienna Uncovered

A few months later, I was in Lisbon, which you’ll know if you’ve been keeping up with my posts here. Lisbon was fun because I took a train off to the west coast, so I got a map with two hubs of activity with a long straight train ride between them:

Lisbon Uncovered

Lisbon was also where I finally got a “landmark” achievement. The app has its own (somewhat eccentric, I think) collection of landmarks, and by visiting them you can tick it off your list. If you visit enough, you get an achievement. Is this a good way to plan your travel? No. Is it fun if it happens anyway? Well, for me it was. I got Belém Tower.

Weirdly, there are no World Uncovered landmarks in Philly or in Melbourne. Still, I’ll keep an eye out for landmarks on future trips. I also wouldn’t mind getting a few of the “passport” achievements for visiting new countries. That’ll take some time, though!

As for the app itself, it feels sort of dated. It hasn’t had an updated in three or four years, and the UI is kind of clunky. The backup feature constantly needs to be reauthenticated with Dropbox, and unless you knew to turn on GPX trip mapping from day one, most of your backup will be in an encrypted zip file. So, I live in modest fear of losing all this data someday, and might look at some better way to do this. (Maybe log all my GPX data in some other app and then import it here later? I don’t know.)

I did have some email interaction with the developer recently, who told me that the app isn’t dead, just done. I can respect that, given all the software of mine that I feel is just done. I’ll keep enjoying it and not worry about its future.

Oh, and as for how I’m enjoying it, I should talk about one more thing: shorties.

Philadelphia is a grid. I like this, because it makes the city much easier for me to navigate and think about. The weird layout of Boston was sort of charming, but also kind of a total pain. I like the grid. In Center City, the grid runs from 30th Street at the west to Front Street (which is basically 1st Street) at the east. Right in the middle, Broad Street (which is basically 14th) divides the city in half. The other main north/south streets are numbered 2-29. Then the major east/west streets run from the Schuylkill River at the west to the Delaware River at the east. They’re mostly named after trees, and there are few enough that it’s pretty easy to name them all.

The thing is, there are lots of other streets in the grid. For example, between 11th and 12th is Marvine Street, running north/south. It’s not always there, though, just sometimes. It runs from Catharine north to Bainbridge, but then stops. It shows up again way further north at Race, running just one block to Vine, and then showing up again later. These streets have been dubbed “shorties” by my excellent colleague Lacey. They’re great, with lots of character and not much traffic. A hundred years ago, each length of shorty might have its own name, but they were rationalized in the 20th century. The street halfway between 8th and 9th is Darien. If it’s between 8th and 9th, but west of center, it’s Schell. If it’s east of center, it’s Mildred. Some blocks have one, two, or all three between them. (Marvine is a funny one. Between Lombard and Walnut, it’s Quince instead. I bet there’s history.)

Anyway, I would like to walk down every shorty in center city. This is not hard, it’s just going to take a lot of time, and a lot of consultation with the map. World Uncovered makes that easy. I think my next plan for tackling these is to start picking one block between home and work and on the way in, hit all of its shorties. Then another one on the way home. That will only get me about a quarter of the city, tops, but it’s a start.

The real treat is when I stop at a street that’s really rich in shorties, especially interior second-order ones, like this gem:

10th and Locust

Honestly, look at that tiny length of Irving Street, which often connects two numbered streets east to west. Here, it’s a tiny little alley inside the block, only reachable by another shorty. What a city!

Elements or something #perl

Published by Simon Green on Sunday 19 May 2024 11:42

Weekly Challenge 269

Each week Mohammad S. Anwar sends out The Weekly Challenge, a chance for all of us to come up with solutions to two weekly tasks. My
solutions are written in Python first, and then converted to Perl. It's a great way for us all to practice some coding.

Challenge, My solutions

Task 1: Bitwise OR


You are given an array of positive integers, @ints.

Write a script to find out if it is possible to select two or more elements of the given array such that the bitwise OR of the selected elements has at least one trailing zero in its binary representation.

My solution

So we know that a number that has at least one trialing zero is an even number (i.e. the 1 bit is not set). We also know that OR-ing a value won't remove any set bits. Therefore solving this task is as straight forward as making sure we have at least two even numbers in ints.

def bitwise_or(ints: list) -> bool:
    even_count = sum(1 for i in ints if i % 2 == 0)
    return even_count >= 2


$ ./ 1 2 3 4 5

$ ./ 2 3 8 16

$ ./ 1 2 5 7 9

Task 2: Distribute Elements


You are given an array of distinct integers, @ints.

Write a script to distribute the elements as described below:

  1. Put the 1st element of the given array to a new array @arr1.
  2. Put the 2nd element of the given array to a new array @arr2.

Once you have one element in each arrays, @arr1 and @arr2, then follow the rule below:

If the last element of the array @arr1 is greater than the last element of the array @arr2 then add the first element of the given array to @arr1 otherwise to the array @arr2.

When done distribution, return the concatenated arrays. @arr1 and @arr2.

My solution

For this task, I simply follow the instructions as set out in the task. With each step I remove the item from ints, and continue until it is exhausted.

def distribute_elements(ints: list) -> list:
    arr1 = [ints.pop(0)]
    arr2 = [ints.pop(0)]

    while ints:
        if arr1[-1] > arr2[-1]:

    return arr1 + arr2


$ ./ 2 1 3 4 5
(2, 3, 4, 5, 1)

$ ./ 3 2 4
(3, 4, 2)

$ ./ 5 4 3 8
(5, 3, 4, 8)

(cdxcvi) 6 great CPAN modules released last week


Published by /u/niceperl on Sunday 19 May 2024 07:06

(cdxcvi) 6 great CPAN modules released last week


Published by Unknown on Sunday 19 May 2024 09:06

Updates for great CPAN modules released last week. A module is considered great if its favorites count is greater or equal than 12.

  1. Devel::CheckOS - a script to package Devel::AssertOS modules with your code.
    • Version: 2.02 on 2024-05-15, with 17 votes
    • Previous CPAN version: 2.01 was 13 days before
    • Author: DCANTRELL
  2. Log::Contextual - Simple logging interface with a contextual log
    • Version: 0.009000 on 2024-05-15, with 13 votes
    • Previous CPAN version: 0.008001 was 6 years, 3 months, 27 days before
    • Author: HAARG
  3. MetaCPAN::Client - A comprehensive, DWIM-featured client to the MetaCPAN API
    • Version: 2.032000 on 2024-05-15, with 25 votes
    • Previous CPAN version: 2.031001 was 2 months, 4 days before
    • Author: MICKEY
  4. Mojolicious - Real-time web framework
    • Version: 9.37 on 2024-05-13, with 497 votes
    • Previous CPAN version: 9.36 was 2 months, 5 days before
    • Author: SRI
  5. PDF::API2 - Create, modify, and examine PDF files
    • Version: 2.047 on 2024-05-18, with 30 votes
    • Previous CPAN version: 2.045 was 7 months, 23 days before
    • Author: SSIMMS
  6. Sub::Override - Perl extension for easily overriding subroutines
    • Version: 0.11 on 2024-05-14, with 15 votes
    • Previous CPAN version: 0.10 was 5 months, 9 days before
    • Author: MVSJES

MariaDB 10 and SQL::Translator::Parser

Published by russbrewer on Saturday 18 May 2024 19:44

Following up on my previous post (MariaDB 10 and Perl DBIx::Class::Schema::Loader), I wanted to try the 'deploy' feature to create database tables from Schema/Result classes.

I was surprised that I could not create a table in the database when a timestamp field had a default of current_time(). The problem was that the generated CREATE TABLE entry placed quotes around 'current_timestamp()' causing an error and rejected entry.

As mentioned in a previous post, I had created file SQL/Translator/Parser/ as part of the effort to get MariaDB 10 clients to work correctly with DBIx::Class::Schema::Loader. Initially it was a clone of the file with name substitutions. To correct the current_timestamp problem I added a search/replace in the existing create_field subroutine in the file to remove the quotes.

# current_timestamp ?
# current_timestamp (possibly as a default entry for a
# new record field), must not be quoted in the CREATE TABLE command
# provided to the database. Convert 'current_timestamp()'
# to current_timestamp() (no quotes) to prevent CREATE TABLE failure

if ( $field_def =~ /'current_timestamp\(\)'/ ) {
$field_def =~ s/'current_timestamp\(\)'/current_timestamp\(\)/;

This entry is made just before the subroutine returns $field_def. Now $schema->deploy(); works correctly to create the entire database.

The code shown below was tested satisfactorily to generate CREATE TABLE output (on a per table or multi-table basis) suitable for exporting (using tables Task and User as example table names):

My $schema = db_connect();

my $trans  = SQL::Translator->new (
     parser      => 'SQL::Translator::Parser::DBIx::Class',
     quote_identifiers => 1,
     parser_args => {
         dbic_schema => $schema,
         add_fk_index => 1,
         sources => [qw/
           Task User
     producer    => 'MariaDB',
    ) or die SQL::Translator->error;

my $out = $trans->translate() or die $trans->error;

I believe the SQL/Translator/Parser/ file would benefit from this same code addition but I have not tested using a MySQL database and DBD::mysql.

MariaDB 10 and Perl DBIx::Class::Schema::Loader

Published by russbrewer on Saturday 18 May 2024 18:15

Fixing DBIx::Class::Schema::Loader For Use With MariaDB 10 Client Software

I recently set up a virtual Server Running Rocky Linux 9 as a client from which to query a remote MariaDB database. I used perlbrew to install Perl 5.38.2. I installed client related RPMs for MariaDB 10.5, I installed DBIx::Class as a relational mapper that can create Perl Schema Result Classes for each table in the database. If you are new to DBIx::Class, you can review its purpose and features in DBIx::Class::Manual::Intro. The Result Classes used by Perl to query the database are stored on the client server in a schema directory. They are created with the DBIx::Class::Schema::Loader module.

I only work with databases as a home hobbyist, but I have successfully used DBIx::Class and related DBIx::Class::Schema::Loader from a CentOS 7 server running Perl 5.24.1 with MariaDB 5.5 client related RPMs. My intent was to replace a CentOS 7 virtual server with a Rocky 9 virtual server and upgrade from MariaDB 5 client to a MariaDB 10 client.

The CentOS 7 client used DBD::mysql which works fine with MariaDB 5 but would not install on the Rocky server which used MariaDB 10 RPMs. So I installed DBD::MariaDB and DBIx::Class::Storage::DBI::MariaDB on the client Rocky server.

To create my relationship classes, I ran the schema loader and was surprised that DBIx::Class::Schema::Loader did not produce correct Result Classes on the Rocky 9 server. Later I found that it did not work properly a on Rocky 8 server either. The common issue was MariaDB version 10 compatibility with DBIx::Class::Schema::Loader (and its dependencies).

I am not sure of everything that was wrong with the Result Classes, but the obvious problems were missing the primary keys entries, missing auto_increment entries and missing unsigned integer entries for all Result Classes which should have them.

I found the problem described (but not resolved) in November 2023 in this short Perl Monks thread.

Below I describe the steps I took to get DBIx::Class::Schema::Loader and its dependencies to produce Result Classes on the MariaDB 10 client (Rocky 8 and 9) servers that was identical to that being produced on the MariaDB 5 client CentOS 7 server, remembering that all of them where creating the Result Classes by connecting to the same remote database server. Although not significant for this issue, the remote database was running smoothly on a Rocky 8 server using MariaDB 10.3.

Essential Edits Directly Affecting Schema Loader

First I noticed that the DBIx/Class/Schema/Loader/DBI directory had a file but had no counterpart. So I made a copy of named and then I edited the new file to change references to mysql and MySQL to MariaDB. Note that almost all the edits can use MariaDB as the substitute for mysql and MySQL but entries in the "_extra_column_info" subroutine must use lowercase "mariadb". This is because they refer to lowercase terminology expected by DBD::MariaDB as can be seen in site_perl/5.38.2/x86_64-linux/DBD/

In DBIx/Class/Schema/Loader/DBI/, for subroutine "_extra_column_info", keep references to mariadb in lowercase. For example:

  • mysql_is_auto_increment should become mariadb_is_auto_increment
  • $dbi_info->{mysql_type_name} should become $dbi_info->{mariadb_type_name}

In all other cases I used MariaDB (not mariadb) as the substitution.


I then realized that DBIx::Class::Schema::Loader depends on DBIx::Class::SQLMaker which supports a number of dependent modules such as,, and, but did not have a corresponding file. So I made a copy of named and then I edited the new file to change references to mysql and MySQL to MariaDB.

After the edits, the Schema loader started working correctly in that running Schema Loader created Schema Result Classes that matched the output of the older MariaDB 5 client.

Additional Edits not Directly Affecting Schema Result Classes Generation

Although apparently not directly related to the functioning of DBIx::Class::Schema:Loader, there are several other files that might need similar editing to provide full MariaDB functionality via DBIx::Class. Your Perl version may differ, but for me these modules are:

  • DBIx/Class/PK/Auto/
  • site_perl/5.38.2/SQL/Translator/Generator/DDL/
  • site_perl/5.38.2/SQL/Translator/Parser/
  • site_perl/5.38.2/SQL/Translator/Parser/DBI/
  • site_perl/5.38.2/SQL/Translator/Producer/

The directories contain references to other database types but do not provide a file. Inside each of the above directories, I copied the file and named it Then I edited each new file to change mysql and MySQL entries to MariaDB entries. These additional files are not required to get the loader to simply create the Schema Result Classes from a database. I need to test to see what effect adding the files to these directories has on DBIx::Class functionality.

The following four files make internal references to mysql or MySQL but did not have a reference to MariaDB. Therefore, I edited each file:

For file DBIx/Class/Storage/DBI/, which is provided from CPAN, in subdirectory sqlt_type, edit to return 'MariaDB' instead of returning 'MySQL'.

Also change this line:
to this line:

In the file there is a subroutine named ‘parse_mysql_version’. Copy this subroutine, and name it ‘parse_MariaDB_version’. Then edit subroutine parse_MariaDB_version to change references to MariaDB instead of MySQL. Finally, edit the Export_OK entry to include parse_MariaDB_version.


Add a MariaDB entry to the %CDBI_auto_pkgs hash


Add a MariaDB entry to the %type_to_dbd hash


After making the essential edits I was able to produce Schema Result Classes that appear to be accurate and not missing information. After making the additional edits the Schema Loader still worked correctly.

Caveats and Unknowns:

I have not been able to do production level testing on these changes. I suspect the additional edits and some as yet unidentified edits are needed for full DBIx::Class functionality with MariaDB 10. For example, version control for using the Schema to modify the database (instead of reading the database to create the schema) is probably not working.

I have only tested the schema result class build with a command such as:

use DBIx::Class::Schema::Loader qw/ make_schema_at /;
        debug          => 1,
        dump_directory => './lib/test',
        create         => 'static',
        components     => [ 'TimeStamp' ]
        'dbi:MariaDB:database=database_name;', 'username',
        'secret_pw', { AutoCommit => '1' }

My criterion for success was that (after just the essential edits) the MariaDB 10 clients (on my Rocky 8 and 9 servers) produced identical schema result classes as my MariaDB 5 client running on my CentOS 7 server when querying the same Maria 10 database.

My target database consists of 46 tables containing an assortment on foreign keys defining has_many, belongs_to and many_to_many relationships. The tables contain unsigned integers, unique keys, combined primary keys, auto_increment, integers (signed and unsigned), timestamp, NULLS and not_NULLS, char, varchar, and text data types.

This information is part of a work in progress and my testing is not yet complete. Use these changes at your own risk. They are offered without warranty. You should test thoroughly before incorporating them in important work. Generate your test schemas to a separate directory to avoid harming a known good schema.

If you can provide additional information, corrections and improvements, please share them.

t/harness: Fix grammar in comment

Perl commits on GitHub

Published by khwilliamson on Saturday 18 May 2024 17:21

t/harness: Fix grammar in comment

perldelta: add PERL_RC_STACK

Perl commits on GitHub

Published by iabyn on Saturday 18 May 2024 10:07

perldelta: add PERL_RC_STACK

This is a final summary of the state of the new ref-counted stack
facility at the 5.40.0 release: and is intended to be added to the
5.40.0 perldelta, to replace (rather than than be in addition to) any
  earlier mentions of PERL_RC_STACK in the 5.39.2 and .6 perldeltas.

This week in PSC (145)

Published by Perl Steering Council on Saturday 18 May 2024 09:28

This meeting was done in person at the Perl Toolchain Summit 2024.

  • Reviewed game plan for (hopefully) last development release, to be done tomorrow, as well as the stable v5.40 release.
  • Reviewed recent issues and PRs to possibly address before next releases.
  • Reviewed remaining release blockers for v5.40, and planned how to address them.
  • Discussed communication between PSC and P5P and how to improve it.

Perl Toolchain Summit 2024 - Lisbon Portugal

Published by Chad 'Exodist' Granum on Saturday 18 May 2024 09:22

I just got back from the Perl Toolchain Summit 2024 in Lisbon Portugal!

Thank you to Grant Street Group for sponsoring my attendance at the event! Grant Street Group is an amazing place to work, and GSG is hiring! Contact me on (Exodist) if you would like a referral.

This year I took a little side trip before the PTS to explore Lisbon with my wife. It is an amazing city, with a lot of history. I highly recommend visiting it and exploring the castles, palaces, and archaeological sights!

My goal for the PTS was to polish up Yath 2.0 and get it out the door. Spoiler alert: I did not achieve this goal, though I did make good progress. Instead several other things occurred that were even better as far as achieving things that require collaboration go!

Test2/Test2::Suite updates

I had several bug reports that built up over the last couple months. Most of my first day at the PTS was spent fixing these and minting new releases. See the changelog for Test-Simple for details. Without this event it would have been harder to find time to work all these. I also fixed a couple other modules, see my module upload list for all the modules I updated at the PTS.

PAUSE contribution

The PAUSE developers needed a way to manage concurrency. Charsbar (Kenichi Ishigaki) approached me about Parallel::Runner, which was exactly what they needed, but used some outdated modules as I have not touched it in almost a decade. I was able to mint a new release with better and more modern dependencies. Now Parallel::Runner is used under the hood for some PAUSE processes.

Using Yath to test modules on install

Additionally Garu approached me and Leon T. about using Yath as a better and universal way to test modules and upload results to cpanm. This resulted in a collaboration between myself and Leon where we made it will be possible to tell cpan, cpanm, etc to use Yath instead of prove! Once Yath 2.0 and a non-dev version of the new Test-Harness are both available you can do this.

  1. You need version 3.49 or greater of Test-Harness (Currently this is only available in a dev version).
  2. Install yath 2.0 (not released yet, but soon!)
  3. Run like this: HARNESS_SUBCLASS=TAP::Harness::Yath cpanm MODULE
  4. You can also set the TAP_HARNESS_YATH_ARGS env var to add comma separated args. (Example: "-j9,-B")

Yath working group (not an official name)

Garu, Preaction, Ilmari, and I came together to discuss Yath. A new goal for yath is to make it possible for Yath to send cpan testers reports. Garu wants a clear and easy way to make reports. Yath, specially with the above changes to Test-Harness should greatly simplify the process. (We also need a cpantesters plugin for Yath)

Ilmari helped me out with an Audit of the DBIc::Class components of Yath, as well as a short review of the schema where he fixed some index definitions. I am very grateful for this code review.

Preaction and I discussed creating a cpan central Yath server (formerly Yath::UI). This would be a very useful tool both for people running tests, and people trying to fix any issues the tests reveal.

Finally we are now trying to plan a Yath hackathon some time this year to all get together and improve Yath. If 2.0 is not released before the hackathon then the goal of the hackathon will be to get it there.

Other items

Many other things happened at the PTS. We had discussions about security and PAUSE/cpan. Metacpan and PAUSE both had significant work done to them, and both are much better today as a result.I did not actively participate in these improvements, so stay tuned for blogs from other attendees!

Monetary sponsors:, The Perl and Raku Foundation, Deriv, cPanel, Inc Japan Perl Association, Perl-Services, Simplelists Ltd, Ctrl O Ltd, Findus Internet-OPAC, Harald Joerg, Steven Schubiger.

In kind sponsors:

Fastmail, Grant Street Group, Deft, Procura, Healex GmbH, SUSE, Zoopla.

PTS 2024 - day 1

Published by Ranguard on Saturday 18 May 2024 09:22

I am always flattered to be invited to the Perl Toolchain Summit, and reinvigorated in working on MetaCPAN each time.

Currently I am focused on building on the work I and others did last year in setting up Kubernetes for more of MetaCPAN (and other projects) to host on.

Last week I organised the Road map which was the first thing we ran through this morning. I was very fortunate to spend the day with Joel and between us we managed to setup:

- Hetzner (hosting company) volumes auto provisioning in the k8s cluster
- Postgres cluster version (e.g. with replication between nodes)

I had a few discussions with other projects interested in hosting and this has helped us start work on what we need to be able to provision and how.. especially with attached storage which has been some what of a challenge but we are heading towards a solution.

MetaCPAN indexing stopped... again.. because our bm-mc-01 server had disk issues (been going on for a couple of weeks). Whilst Oalders shutdown the server I switched over the puppet setup so bm-mc-02 was the primary postgres DB and cronjobs which will keep us going for a while longer, but does mean we are reliant on 2 servers which is not ideal from a failover point of view. Oalders has raised an issue with the hosting company... so we'll see how that works out.

Sponsors who make this possible Monetary sponsors:, The Perl and Raku Foundation, Deriv, cPanel, Inc Japan Perl Association, Perl-Services, Simplelists Ltd, Ctrl O Ltd, Findus Internet-OPAC Harald Joerg, Steven Schubiger. In kind sponsors: Fastmail, Grant Street Group, Deft, Procura, Healex GmbH, SUSE, Zoopla.

Day 2 and 3, the bad days

Problem getting Perl command line arguments

Perl questions on StackOverflow

Published by Anonymous on Saturday 18 May 2024 04:16

I just started learning Perl. I attempted to make a simple calculator that takes input from the command line. Input: 5 * 10. Output: 50. But instead, it just prints 5. Here's the code:

use strict;
use warnings;
my $op = $ARGV[1];
my $outpt = eval("return $ARGV[0]"."$op"."$ARGV[2]");
print "$outpt"."\n";

Any advice would be appreciated.

I tried to input all as one string instead, but that resulted in terminal output no matches found. How should I fix the error.

perlfunc/stat: fix description of S_ENFMT and S_IFMT

S_ENFMT properly belongs to the group of permission bits (like
setuid/setgid), not file types. On systems that have it (like AIX), it
can be set/cleared with chmod(). (In fact, it usually shares its value
with S_ISGID because enforced locking is signaled by the combination of
a non-executable file with the setgid bit set.)

S_IFMT($mode) directly gives you one of the file types (S_IFREG,
S_IFDIR, etc). You don't need to bit-and it further (especially not with
the S_IS* functions), contrary to what the comment claims. (The
confusion likely stems from the C side of things, where you'd do `mode &
S_IFMT` to extract the file type from the mode bits, leading to code
like `(mode & S_IFMT) == S_IFDIR`. But even then you could write
`S_ISDIR(mode)` without any bit mask trickery.)

Most of the symbols in the "S_IF* constants" section don't start with
"S_IF", so change to "S_I* constants" everywhere.

Most of the symbols in the "S_IF* functions" section don't start with
"S_IF" (with the sole exception of S_IFMT, which is only a function in
Perl; the C macro is a constant).
(Historical note: This section label used to make more sense because it
documented S_IFMODE and S_IFMT functions, but the former was just a typo
for S_IMODE.)

`perlbook.pod`: Fix few leftovers

Perl commits on GitHub

Published by rwp0 on Friday 17 May 2024 13:45

`perlbook.pod`: Fix few leftovers

The "Safari" reference redirects to anyway.

It is also renamed:'Reilly_Online_Learning_(formerly_Safari_Books_Online)
 perlsub: correct confusing references to local in my docs

The docs for lexical variable declarations referenced 'local' as a mechanism to declare global variables in a couple instances, which is incorrect. 'local' only localizes global variables, it doesn't create or declare them in the common case where strict 'vars' is in effect.

The Perl and Raku Conference (now in its 26th year) would not exist without sponsors. Above, you’ll see a screen shot from Curtis Poe’s Perl’s new object-oriented syntax is coming, but what’s next? talk at last year’s conference in Toronto. You may be wondering how you can add your organization’s logo to this year’s list. In the spirit of transparency, we are making our sponsorship prospectus public. Please share this article freely with friends, colleagues and decision makers so that we can reach as many new sponsors as possible.

The Perl and Raku Conference 2024 Prospectus

This year the Perl and Raku Conference will be held in Las Vegas, Nevada on June 24-28, 2024. Conferences such as this provide tangible benefits to organizations which use Perl. Aside from the transfer of knowledge which attendees bring back to their place of work, on-site hackathons also contribute to the growth and maintenance of the software stack which so many companies have come to rely on. In 2022, for example, the hackathon focused on modernizing and improving support for Perl across various editors, allowing Perl developers to be even more productive than they have been in the past.

There are still opportunities to support this important, grassroots Open Source Software event. Events like these largely depend on sponsors in order to thrive.

This year, we are looking for corporate donations to offset the costs of feeding conference attendees. Each of these sponsorship opportunities comes with the following:

  • your logo, should you provide one, will appear on the banners which are displayed behind speakers and will subsequently appear in speaker videos
  • your logo, a short blurb and a long blurb about your company will appear on the event website
  • you will be listed as a sponsor in the materials handed out at the event
  • we will thank you publicly at the event
  • if you are able to provide some swag, we will gladly distribute it at the conference via our swag bags

Breakfast Sponsor (3 available)

Sponsor a catered breakfast during one of the conference days

Sponsorship commitment: $3,500

Snack Breaks (2 available)

Sponsor a catered snack break during one of the conference days.

Sponsorship commitment: $3,000

Coffee Break Sponsor (2 available)

Sponsor a coffee break during one of the conference days.

Sponsorship commitment: $2,500

Please do let me know at what level you might be interested in contributing and we can begin the process of getting you involved in this very special event.


In order to get your logo on the “step and repeat” banner we would need to have finalized sponsorship and received logo assets by June 1st, so we’d love to help you start the process as soon as you’re ready.


For any questions or to begin the sponsorship process, please contact me via I’ll be happy to answer any questions and walk you through the process. If you’d like to discuss sponsorship options which are greater or smaller than the offerings listed, I can also work with you on that. If you’re not ready to sponsor this event but would like to be included in future mailings, please reach out to me via email as well. I look forward to hearing from you!

Spaces are Limited

In 2024 we expect to host over 100 attendees, but there is a hard cap of 150. If you’re thinking of attending, it’s best to secure your ticket soon.

PWC 269 Two of Us Distributing Elements #perl

Published by Bob Lied on Wednesday 15 May 2024 14:08

You and I have memories, longer than the road that stretches out ahead. Remember when refactoring was a Big Deal? Let's do some of that this week.

Two of Us Lyrics Music

Task 2: Distribute Elements

You are given an array of distinct integers, @ints.

Write a script to distribute the elements as
described below:

1) Put the 1st element of the given array to
a new array @arr1.
2) Put the 2nd element of the given array to
a new array @arr2.

Once you have one element in each arrays,
@arr1 and @arr2, then follow the rule below:

If the last element of the array @arr1 is greater
than the last element of the array @arr2, then
add the first element of the given array to @arr1,
otherwise to the array @arr2.

When done distribution, return the concatenated
arrays, @arr1 and @arr2.

Example 1

  • Input: @ints = (2, 1, 3, 4, 5)
  • Output: (2, 3, 4, 5, 1)

    • 1st operation: Add 2 to @arr1 = (2)
    • 2nd operation: Add 1 to @arr2 = (1)
    • 3rd operation: Now the last element of @arr1 is greater than the last element of @arr2, so add 3 to @arr1 = (2, 3).
    • 4th operation: Again the last element of @arr1 is greater than the last element of @arr2, add 4 to @arr1 = (2, 3, 4)
    • 5th operation: Finally, the last element of @arr1 is again greater than the last element of @arr2, add 5 to @arr1 = (2, 3, 4, 5)
    • Now we have two arrays: @arr1 = (2, 3, 4, 5) and @arr2 = (1)
    • Concatenate the two arrays and return the final array: (2, 3, 4, 5, 1).

Phase 1, in which Doris gets her oats

That's a very prescriptive specification and example. We could hardly do anything else.

sub distElem(@ints) 
    my @arr1 = shift @ints; 
    my @arr2 = shift @ints; 
    while ( defined(my $n = shift @ints) )
        if ( $arr1[-1] > $arr2[-1] ) {
            push @arr1, $n;
        } else {
            push @arr2, $n;
    return [ @arr1, @arr2 ];

Perl notes:

  • We're using up the @ints array by shifting off one element at a time. Numbers could be zero, and we don't want that interpreted as false, so the accurate check is to look for the undef when the array becomes empty.
  • Perl can index from the end by using negative offsets. We don't have to do any bookkeeping about the lengths of the arrays.

Sunday driving, not arriving

It irks me to have the two variables named arr1 and arr2. What is this, BASIC? It's a list of two arrays, so let's do that refactoring.

sub distElem(@ints) 
    my @arr = ( [shift @ints], [shift @ints] );
    while ( defined(my $n = shift @ints) )
        if ( $arr[0][-1] > $arr2[1][-1] ) {
            push @{$arr[0]}, $n;
        } else {
            push @{$arr[1]}, $n;
    return [ $arr[0]->@*, $arr[1]->@* ];

Perl notes:

  • We now have an array of two references to arrays, so we see array de-referencing syntax. The first argument to push needs to be an array, so the @{...} turns the reference into an array. In the return statement, I use newer-style postfix de-referencing.

Burning matches, lifting latches

Now I'm annoyed by that if statement. We only have to choose between 0 and 1, and we have a condition that will be either true or false. Zero, one; false, true. Po-tay-to, po-tah-to. Let's use that condition to make an index.

sub distElem(@ints) 
    my @arr = ( [shift @ints], [shift @ints] );
    while ( defined(my $n = shift @ints) )
        my $which = ( $arr[0][-1] <= $arr[1][-1] );
        push @{$arr[$which]}, $n;
    return [ $arr[0]->@*, $arr[1->@*} ];

Perl notes:

  • True and false values will be interpreted as 1 and zero, respectively, when used in an arithmetic context.
  • I changed the test from > to <= so that the array order is the same.

Chasing paper, getting nowhere

Introducing the $which variable seems arbitrary. Let's put that in-line.

sub distElem(@ints) 
    my @arr = ( [shift @ints], [shift @ints] );
    while ( defined(my $n = shift @ints) )
        push @{$arr[ $arr[0][-1] <= $arr[1][-1 ]}, $n;
    return [ $arr[0]->@*, $arr[1->@*} ];

Wearing raincoats, standing solo

Why am I chewing up the @ints array with shifts? Let's just iterate over it.

sub distElem(@ints) 
    my @arr = ( [shift @ints], [shift @ints] );
    push @{$arr[ $arr[0][-1] <= $arr[1][-1 ]}, $_ for @ints;
    return [ $arr[0]->@*, $arr[1->@*} ];

We're on our way home, we're going home

One last thing: can we make it do reasonable things when the @ints array has 0 or 1 elements? Currently, that inital shift to initialize @arr would put an undef value into the lists. Let's account for the possibility.

sub distElem(@ints)
    my @arr = ( [ (shift @ints) // () ], [ (shift @ints) // () ] );

    push @{$arr[ ( $arr[0][-1] <= $arr[1][-1] ) ]}, $_ for @ints;

    return [ $arr[0]->@*, $arr[1]->@* ];

Perl notes:

  • shift on an empty array will yield undef, but we want an empty list in that case.
  • The // operator is really useful for checking defined-ness. In the old days, code was littered with if (defined(...)) tests.

The long and winding road (oops, wrong song)

That was the process I used to get from 11 lines to 3. Of course, there were unit tests executed at every step. The final code, including tests is in GitHub

Confirming The LPW 2024 Venue & Date #perl

Published by Lee J on Wednesday 15 May 2024 12:44

We're happy to confirm the venue and date of this year's London Perl & Raku Workshop.

  • When: Saturday 26th October 2024
  • Where: The Trampery, 239 Old Street, London EC1V 9EY

This year's workshop will be held at The Trampery, at Old Street. A dedicated modern event space in central London. We have hired both The Ballroom and The Library; allowing us to run a main track for up to 160 attendees, and second smaller track for up to 35 attendees.

The Trampery in Old Street is located a two minute walk from the Northern Line's Old Street tube station in central London. The Northern Line has stops at most of the major train stations in London, or trivial links to others, so we recommend taking the tube to get to the venue.

If you haven't already, please signup and submit talks using the official workshop site:

Thanks to this year's sponsors, without whom LPW would not happen:

If you would like to sponsor LPW then please have a look at the options here:

Confirming The LPW 2024 Venue & Date


Published by /u/leejo on Wednesday 15 May 2024 12:35

About Perl Programming

Perl on Medium

Published by Vcanhelpsu on Wednesday 15 May 2024 07:40

Perl Weekly #668 - Perl v5.40 #perl

Published by Gabor Szabo on Monday 13 May 2024 09:21

Originally published at Perl Weekly 668

Hi there,

The latest Perl Steering Council weekly updates about the good progress in preparation of release of Perl v5.40. I can't wait to get my hand dirty with the new features.

London Perl Workshop is making good progress thanks to the hard work of Lee Johnson. As per the official website, we now have a Diamond Sponsor. I am hoping venue would be finalised soon. I would urge all Perl fans to register your interest in the event so that the organiser can plan the event better.

The upconing event, The Perl and Raku Conference in Las Vegas, is in demand. I get to hear a lot of preparation is underway to make it memorable experience for all attendees. I am going to miss the fun, unfortunately. I hope to join you all online if it is available.

Last but not least, you take extra care of yourself and your loved ones. Enjoy and celebrate Perl as always.

Your editor: Mohammad Sajid Anwar.


This Week in PSC (147)

Good news is shared that Perl v5.40 is likely to be released on time in May. Hurray !!!

Maintaining Perl (Tony Cook) February 2024


Perl Toolchain Summit 2024 - Lisbon

Nice to hear the work done by CPANSec Group. We are happy to see members are actively working on the security aspect.

MariaDB 10 and Perl DBIx::Class::Schema::Loader

Interesting topic brought to the discussion table with regard to the use of DBIx::Class and it's family. It is thorough discussion and not just scratch the surface.

Making a Super Cal if Rage Will Stick Ex Paella Down Us

Calendar is one topic that has been discussed plenty of times and we have loads of different implmentation available on CPAN. Saif is bringing a new flavour, go check it out.

The Weekly Challenge

The Weekly Challenge by Mohammad Sajid Anwar will help you step out of your comfort-zone. We pick one champion at the end of the month from among all of the contributors during the month.

The Weekly Challenge - 269

Welcome to a new week with a couple of fun tasks "Bitwise OR" and "Distribute Elements". If you are new to the weekly challenge then why not join us and have fun every week. For more information, please read the FAQ.

RECAP - The Weekly Challenge - 268

Enjoy a quick recap of last week's contributions by Team PWC dealing with the "Magic Number" and "Number Game" tasks in Perl and Raku. You will find plenty of solutions to keep you busy.


A new CPAN module introduced Data::Show. Time to explore more about it. Thanks for sharing.

Numerous Numbers

Smart match of Raku is really cool. The post shares the use of smart match. Highly recommended.

Games Numbers Play

I love the varieties of different level of solutions. Start with simple and then move upward to make it more elegant. Great work.

Perl Weekly Challenge: Week 268

Ever wanted to implement Z- operator in Perl? Well it is already done and shared. Just check it out yourself.

Sorting This and That

My personal favourite PDL is in the game again. Thanks for sharing knowledge with us.

Perl Weekly Challenge 268: Magic Numbers

Reduction operator of Raku is one of the most powerful operator. Please checkout the post to see how it can be used.

Perl Weekly Challenge 268: Number Game

Handy Raku REPL is showing off the power. You really don't want to skip it. Thanks for sharing.

arrays and slices

Another Raku fan talking about rotor of Raku. I wonder if this can be reproduced this in Perl?

Perl Weekly Challenge 268

Master of one-liner in Perl, sharing experimental for_list. Time to explore more about it soon. Well done and keep it up.

Perl Magic Games

Task analysis is the top level and very engaging. Thanks for sharing the knowledge with us.

Let’s do the Numbers!

Short and compact solutions in Perl, Raku and Python. Plenty to keep you busy. You get to listen to music as bonus.

Magic and scrambled numbers

Peter finally gave in and created one-liner in Perl. It is so much fun to see how powerful it is.

The Weekly Challenge - 268

Well documented solutions with smart use of CPAN module. Well done, keep it up great work.

The Weekly Challenge #268

I noticed the zip6 is mentioned in the blog post but in code, pairwise is used. Interesting, zip6 is new to me, though.

If the Game is Magic, Where's My Number?

One liner in Python and PostScript. Bonus for this week is the introduction to Crystal. Keep it up great work.

The magical number game

Is it possible to have multiple return types in Python? I didn't know that, I liked how it is perfectly used here. Thanks for sharing the magic with us.


2024.19 Behaviorally Constrained

Weekly collections

NICEPERL's lists

Great CPAN modules released last week;
StackOverflow Perl report.

You joined the Perl Weekly to get weekly e-mails about the Perl programming language and related topics.

Want to see more? See the archives of all the issues.

Not yet subscribed to the newsletter? Join us free of charge!

(C) Copyright Gabor Szabo
The articles are copyright the respective authors.

Data::Fake::CPAN (a PTS 2024 supplement)

rjbs forgot what he was saying

Published by Ricardo Signes on Sunday 12 May 2024 12:00

One of the things I wrote at the first PTS (back when it was called the Perl QA Hackathon) was Module::Faker. I wrote about it back then (way back in 2008), and again eleven years later. It’s a library that, given a description of a (pretend) CPAN distribution, produces that distribution as an actual file on disk with all the files the dist should have.

Every year or two I’ve made it a bit more useful as a testing tool, mostly for PAUSE. Here’s a pretty simple sample of how those tests use it:

$pause->upload_author_fake(PERSON => 'Not-Very-Meta-1.234.tar.gz', {
  omitted_files => [ qw( META.yml META.json ) ],

This writes out Not-Very-Meta-1.234.tar.gz with a Makefile.PL, a manifest, and other stuff. The package and version (and a magic true value) also appear in lib/Not/Very/ Normally, you’d also get metafiles, but here we’ve told Module::Faker to omit them, so we can test what happens without them. When we were talking about testing the new PAUSE server in Lisbon, we knew we’d have to upload distributions and see if they got indexed. Here, we wouldn’t want to just make the same test distribution over and over, but to quickly get new ones that wouldn’t conflict with the old ones.

This sounded like a job for Module::Faker and a random number generator, so I hot glued the two things together. Before I get into explaining what I did, I should note that this work wasn’t very important, and we really only barely used it, because we didn’t really need that much testing. On the other hand, it was fun. I had fun writing it and seeing what it would generate, and I have plans to have more fun with it. After a long day of carefully reviewing cron job logs, this work was a nice goofy thing to do before dinner.


Data::Fake is a really cool library written by David Golden. It’s really simple, but that simplicity makes it powerful. The ideas are like this:

  1. it’s useful to have a function that, when called, returns random data
  2. to configure that generator, it’s useful to have a function that returns the kind of function discussed in #1
  3. these kinds of functions are useful to compose

So, for example, here’s some sample code from the library’s documentation:

my $hero_generator = fake_hash(
        name      => fake_name(),
        battlecry => fake_sentences(1),
        birthday  => fake_past_datetime("%Y-%m-%d"),
        friends   => fake_array( fake_int(2,4), fake_name() ),
        gender    => fake_pick(qw/Male Female Other/),

Each of those fake... subroutine calls returns another subroutine. So, in the end you have $hero_generator as a code reference that, when called, will return a reference to a five-key hash. Each value in the hash will be the result of calling the generators given as values in the fake_hash call.

It takes a little while to get used to working with the code generators this way, but once you do, it comes very easy to snap together generators of random data structures. (When you’re done here, why not check out David Golden’s talk about using higher-order functions to create Data::Fake?) Helpfully, as you can see above, Data::Fake comes with generators for a bunch of data types.

What I did was write a Data::Fake plugin, Data::Fake::CPAN, that provides generators for version strings, package names, CPAN author identities, license types, prereq structures and, putting those all together, entire CPAN distributions. So, this code works:

use Data::Fake qw(CPAN);

my $dist = fake_cpan_distribution()->();

my $archive = $dist->make_archive({ dir => '.' });

When run, this writes out an archive file to disk. For example, I just got this:

$ ./nonsense/module-blaster
Produced archive as ./Variation-20010919.556.tar.gz (cpan author: MDUNN)
- Variation
- Variation::Colorless
- Variation::Conventional
- Variation::Dizzy

There are a few different kinds of date formats that it might pick. This time, it picked That username, MDUNN, is short for Mayson Dunn. I found out by extracting the archive and reading the metadata. Here’s a sample of the prereqs:

  "prereqs" : {
    "build" : {
       "requires" : {
          "Impression::Studio" : "19721210.298"
    "runtime" : {
       "conflicts" : {
          "Writer::Cigarette" : "19830107.752"
       "recommends" : {
          "Error::Membership" : "v5.16.17",
          "Marriage" : "v1.19.6"
       "requires" : {
          "Alcohol" : "v12.16.0",
          "Competition::Economics" : "v19.1.7",
          "People" : "20100228.011",
          "Republic" : "20040805.896",
          "Transportation::Discussion" : "6.069"

You’ll see that when I generated this, I ran ./nonsense/module-blaster. That program is in the Module-Faker repo, for your enjoyment. I hope to play with it more in the future, changing the magic true values, maybe adding real code, and just more variation — but probably centered around things that will have real impact on how PAUSE indexes things.

Probably very few people have much use for Module::Faker, let alone Data::Fake::CPAN. I get that! But Data::Fake is pretty great, and pretty useful for lots of testing. Also, generating fun, sort of plausible data makes testing more enjoyable. I don’t know why, but I always like watching my test suite fail more when it’s spitting out fun made-up names at the same time. Try it yourself!

(cdxcv) 8 great CPAN modules released last week


Published by Unknown on Sunday 12 May 2024 09:43

Updates for great CPAN modules released last week. A module is considered great if its favorites count is greater or equal than 12.

  1. DBD::Oracle - Oracle database driver for the DBI module
    • Version: 1.90 on 2024-05-07, with 31 votes
    • Previous CPAN version: 1.83 was 2 years, 3 months, 21 days before
    • Author: ZARQUON
  2. Firefox::Marionette - Automate the Firefox browser with the Marionette protocol
    • Version: 1.57 on 2024-05-06, with 16 votes
    • Previous CPAN version: 0.77 was 4 years, 9 months, 30 days before
    • Author: DDICK
  3. Minion::Backend::mysql - MySQL backend
    • Version: 1.005 on 2024-05-06, with 13 votes
    • Previous CPAN version: 1.004 was 6 months, 6 days before
    • Author: PREACTION
  4. Path::Tiny - File path utility
    • Version: 0.146 on 2024-05-08, with 188 votes
    • Previous CPAN version: 0.144 was 1 year, 5 months, 7 days before
    • Author: DAGOLDEN
  5. PDL - Perl Data Language
    • Version: 2.089 on 2024-05-11, with 52 votes
    • Previous CPAN version: 2.088 was 20 days before
    • Author: ETJ
  6. Perl::Tidy - indent and reformat perl scripts
    • Version: 20240511 on 2024-05-10, with 140 votes
    • Previous CPAN version: 20240202 was 3 months, 9 days before
    • Author: SHANCOCK
  7. Prima - a Perl graphic toolkit
    • Version: 1.73 on 2024-05-09, with 43 votes
    • Previous CPAN version: 1.72 was 3 months, 9 days before
    • Author: KARASIK
  8. SPVM - The SPVM Language
    • Version: 0.990006 on 2024-05-09, with 31 votes
    • Previous CPAN version: 0.990003 was 8 days before
    • Author: KIMOTO

Outreachy Internship 2024 Updates

Perl Foundation News

Published by Makoto Nozaki on Thursday 09 May 2024 19:21

TL;DR We just finished intern selection for this year’s Outreachy program. We got more projects and more applicants than the previous years, which made the selection hard in a good way.

Continuing our annual tradition, The Perl and Raku foundation is involved in the Outreachy program which provides internships to people subject to systemic bias and impacted by underrepresentation.

We have just finished the intern selection process, which turned out to be harder compared to the previous years. I’ll explain the reasons below.

It was harder because we got multiple high quality project proposals

Each year, we call for project ideas from the Perl/Raku community. Project proposer is required to commit to mentoring an intern from May to August. Given the significant commitment involved, it’s not uncommon for us to find suitable projects.

Fortunately, this year, we got two promising project proposals. The Foundation’s financial situation did not allow us to sponsor both projects, so we had to make the tough decision to support only one project.

After careful consideration, the Board has elected to sponsor Open Food Fact’s Perl project, titled “Extend Open Food Facts to enable food manufacturers to open data and improve food product quality.”

It was harder because more people showed up

Having more projects means we were able to attract more intern candidates. Across the two projects, more than 50 people showed interest and initiated contributions. Among them, 21 individuals actually created pull requests before the selection process.

Needless to say, it's hard work for the mentors to help dozens of candidates. They taught these intern candidates how to code and guided them through creating pull requests. On the applicants’ side, I am amazed that they worked hard to learn Perl and became proficient enough to create pull requests and make real improvements to the systems.

And the final selection was harder because we had more applicants

After the contribution process, we got an application from 14 people. It was obviously hard for the mentors to select one from so many good applicants. In the next post, Stéphane Gigandet will introduce our new intern to the community.

I wish all the best to the mentors, Stéphane and Alex, and our new intern.

Voice from the applicants

"In the journey to understand Perl better, I wanted to know what are its most wide applications, one of them being a web scraper. It's because Perl's strong support for regular expressions and built-in text manipulation functions make it well-suited for tasks like web scraping, where parsing and transforming text are essential. I took inspiration from various web scraping projects available on the internet to gain insights into the process and developed a lyrics scraper."

"I'm currently diving into Perl, and I see this as a fantastic chance to enrich my coding skills. I've thoroughly enjoyed immersing myself in it and have had the opportunity to explore various technologies like Docker and more."

"I have had the opportunity to experience Perl firsthand and have come to appreciate its significance in web development, on which I have worked. During my second year, I was searching for popular languages in backend development and found out about Perl, whose syntax was somewhat like C and Python. I didn't have any previous experience working with Perl, but now I have gained a deep understanding of its importance and impact on backend development and data processing."

"In this pull request, I made a significant stride in improving the quality and maintainability of our Perl codebase by integrating Perl::Critic, a powerful static code analysis tool."

"I've learned a whole lot about Perl and some of its frameworks such as Dancer2 (a surprisingly simple framework I've come to fall in love with)."

What's new on CPAN - April 2024

Published on Thursday 09 May 2024 19:00

Welcome to “What’s new on CPAN”, a curated look at last month’s new CPAN uploads for your reading and programming pleasure. Enjoy!

APIs & Apps

Config & Devops


Development & Version Control

Science & Mathematics



Maintaining Perl (Tony Cook) February 2024

Perl Foundation News

Published by alh on Monday 06 May 2024 19:42

Tony writes:

``` [Hours] [Activity] 2024/02/01 Thursday

2.50 #21873 fix, testing on both gcc and MSVC, push for CI


2024/02/02 Friday 0.72 #21915 review, testing, comments

0.25 #21883 review recent updates, apply to blead


2024/02/05 Monday 0.25 github notifications 0.08 #21885 review updates and approve 0.57 #21920 review and comment 0.08 #21921 review and approve 0.12 #21923 review and approve 0.08 #21924 review and approve 0.08 #21926 review and approve 0.67 #21925 review and comments

2.00 #21877 code review, testing


2024/02/06 Tuesday 0.23 #21925 comment 0.52 review coverity scan report, reply to email from jkeenan 0.27 #21927 review and comment 0.08 #21928 review and approve

0.08 #21922 review and approve


2024/02/07 Wednesday 0.25 github notifications 0.52 #21935 review, existing comments need addressing

2.12 #21877 work on fix, push for CI most of a fix


2024/02/08 Thursday 0.40 #21927 review and approve 0.23 #21935 review, check each comment has been addressed, approve 0.45 #21937 review and approve 0.15 #21938 review and comment 0.10 #21939 review and approve 0.13 #21941 review and approve 0.10 #21942 review and approve 0.08 #21943 review and approve 0.07 #21945 review and approve 0.17 #21877 look into CI failures, think I found problem, push probable fix 0.18 #21927 make a change to improve pad_add_name_pvn() docs, testing, push for CI 2.20 #21877 performance test on cygwin, try to work up a

regression test


2024/02/12 Monday 0.60 #18606 fix minor issue pointed out by mauke, testing 0.40 github notifications 0.08 #21872 review latest changes and approve 0.08 #21920 review latest changes and approve 1.48 #21877 debugging test 0.30 #21524 comment on downstream ticket

0.27 #21724 update title to match reality and comment


2024/02/13 Tuesday 0.35 #21915 review, brief comment 0.25 #21983 review and approve 0.03 #21233 close 0.28 #21878 comment 0.08 #21927 check CI results and make PR 21984 0.63 #21877 debug failing CI 0.27 #21984 follow-up 0.58 #21982 review, testing, comments

0.32 #21979 review and approve


2024/02/14 Wednesday 1.83 #21958 testing, finally reproduce, debugging and comment 0.08 #21987 review discussion and briefly comment 0.08 #21984 apply to blead 0.22 #21977 review and approve 0.12 #21988 review and approve 0.15 #21990 review and approve 0.82 #21550 probable fix, build tests 0.38 coverity scan follow-up 1.27 #21829/#21558 (related to 21550) debugging

0.65 #21829/#21558 more debugging, testing, comment


2024/02/15 Thursday 0.15 github notifications 0.08 #21915 review updates and approve 2.17 #21958 debugging, research, long comment 0.58 #21958 testing, follow-up

0.12 #21991 review and approve


2024/02/19 Monday 0.88 #21161 review comment and reply, minor change, testing, force push 0.23 #22001 review and comment 0.30 #22002 review and comment 0.12 #22004 review and comment 0.28 #22005 review and approve 0.32 #21993 testing, review changes 1.95 #21661 review comments on PR and fixes, review code and

history for possible refactor of vFAIL*() macros


2024/02/20 Tuesday 0.35 github notifications 0.08 #22010 review and approve 0.08 #22007 review and approve with comment 0.60 #22006 review, research and approve with comment 0.08 #21989 review and approve 0.58 #21996 review, testing, comment 0.22 #22009 review and approve 0.50 #21925 review latest updates and approve

1.05 #18606 apply to blead, work on a perldelta, make PR 22011


2024/02/21 Wednesday 0.18 #22011 fixes 0.80 #21683 refactoring

1.80 #21683 more refactor


2024/02/22 Thursday 0.38 #22007 review and comment 0.70 #21161 apply to blead, perldelta as PR22017 1.75 smoke report checks: testing win32 gcc failures 0.27 #22007 review updates and approve

1.15 #21661 re-check, research and push for smoke/ci


2024/02/26 Monday 2.10 look over smoke reports, debug PERLIO=stdio failure on mac

1.38 more debug PERLIO=stdio


2024/02/27 Tuesday 0.08 #22029 review and apply to blead 0.27 #22024 review and approve 0.33 #22026 review and approve 0.08 #22027 review and approve 0.10 #22028 review and approve 0.08 #22030 review and comment, conditionally approve 0.25 #22033 review, comments and approve 0.08 #22034 review and approve 0.17 #22035 review and comment

0.78 #21877 debugging


2024/02/28 Wednesday 0.38 github notifications 0.52 #22040 review discussion, research and comment 0.13 #22043 review and approve 0.12 #22044 review and approve 0.72 #22045 review, research, comment and approve 0.13 #22046 review, research and approve

1.55 #21877 more debugging (unexpected leak)


2024/02/29 Thursday 0.15 #21966 review update and approve 1.18 #21877 debugging

0.13 fix $DynaLoader::VERSION


Which I calculate is 55.79 hours.

Approximately 70 tickets were reviewed or worked on, and 5 patches were applied. ```

(cdxciv) 17 great CPAN modules released last week


Published by Unknown on Saturday 04 May 2024 22:46

Updates for great CPAN modules released last week. A module is considered great if its favorites count is greater or equal than 12.

  1. App::cpm - a fast CPAN module installer
    • Version: 0.997017 on 2024-04-28, with 72 votes
    • Previous CPAN version: 0.997015 was 3 months, 24 days before
    • Author: SKAJI
  2. App::DBBrowser - Browse SQLite/MySQL/PostgreSQL databases and their tables interactively.
    • Version: 2.410 on 2024-05-04, with 14 votes
    • Previous CPAN version: 2.407 was 1 month, 24 days before
    • Author: KUERBIS
  3. App::Netdisco - An open source web-based network management tool.
    • Version: 2.076004 on 2024-05-03, with 16 votes
    • Previous CPAN version: 2.076001 was 9 days before
    • Author: OLIVER
  4. CPAN::Audit - Audit CPAN distributions for known vulnerabilities
    • Version: 20240503.001 on 2024-05-03, with 13 votes
    • Previous CPAN version: 20240414.001 was 18 days before
    • Author: BDFOY
  5. CPAN::Changes - Parser for CPAN style change logs
    • Version: 0.500004 on 2024-05-02, with 32 votes
    • Previous CPAN version: 0.500003 was 2 months, 9 days before
    • Author: HAARG
  6. DBD::mysql - A MySQL driver for the Perl5 Database Interface (DBI)
    • Version: 5.005 on 2024-05-01, with 55 votes
    • Previous CPAN version: 5.004 was 1 month, 13 days before
    • Author: DVEEDEN
  7. DBIx::DataModel - UML-based Object-Relational Mapping (ORM) framework
    • Version: 3.11 on 2024-04-28, with 12 votes
    • Previous CPAN version: 3.10 was 1 month, 17 days before
    • Author: DAMI
  8. Devel::CheckOS - a script to package Devel::AssertOS modules with your code.
    • Version: 2.01 on 2024-05-02, with 17 votes
    • Previous CPAN version: 1.96 was 1 year, 2 months, 26 days before
    • Author: DCANTRELL
  9. Email::MIME - easy MIME message handling
    • Version: 1.954 on 2024-05-02, with 20 votes
    • Previous CPAN version: 1.953 was 1 year, 3 months, 24 days before
    • Author: RJBS
  10. GD - Perl interface to the libgd graphics library
    • Version: 2.81 on 2024-05-03, with 28 votes
    • Previous CPAN version: 2.78 was 9 months, 30 days before
    • Author: RURBAN
  11. Module::Build::Tiny - A tiny replacement for Module::Build
    • Version: 0.048 on 2024-04-28, with 16 votes
    • Previous CPAN version: 0.047 was 7 months before
    • Author: LEONT
  12. Net::DNS - Perl Interface to the Domain Name System
    • Version: 1.45 on 2024-05-02, with 26 votes
    • Previous CPAN version: 1.44 was 2 months, 16 days before
    • Author: NLNETLABS
  13. PerlPowerTools - BSD utilities written in pure Perl
    • Version: 1.045 on 2024-04-30, with 39 votes
    • Previous CPAN version: 1.044 was 1 month, 27 days before
    • Author: BRIANDFOY
  14. SPVM - The SPVM Language
    • Version: 0.990003 on 2024-05-01, with 31 votes
    • Previous CPAN version: 0.990001 was 5 days before
    • Author: KIMOTO
  15. Syntax::Keyword::Match - a match/case syntax for perl
    • Version: 0.14 on 2024-04-30, with 12 votes
    • Previous CPAN version: 0.13 was 9 months, 10 days before
    • Author: PEVANS
  16. Term::Choose - Choose items from a list interactively.
    • Version: 1.765 on 2024-05-02, with 15 votes
    • Previous CPAN version: 1.764 was 12 days before
    • Author: KUERBIS
  17. version - Structured version objects
    • Version: 0.9932 on 2024-04-28, with 21 votes
    • Previous CPAN version: 0.9931 was 1 day before
    • Author: LEONT

TPRF sponsors Perl Toolchain Summit

Perl Foundation News

Published by Makoto Nozaki on Friday 03 May 2024 19:49

I am pleased to announce that The Perl and Raku Foundation sponsored the Perl Toolchain Summit 2024 as a Platinum Sponsor.

The Perl Toolchain Summit (PTS) is an annual event where they bring together the volunteers who work on the tools and modules at the heart of Perl and the CPAN ecosystem. The PTS gives them 4 days to work together on these systems, with all their fellow volunteers to hand.

The event successfully concluded in Lisbon, Portugal at the end of April 2024.

If you or your company is willing to help the future PTS events, you can get in touch with the PTS team. Alternatively, you can make a donation to The Perl and Raku Foundation, which is a 501(c)(3) organization.

PTS 2024: Lisbon

rjbs forgot what he was saying

Published by Ricardo Signes on Friday 03 May 2024 15:19

Almost exactly a year since the last Perl Toolchain Summit, it was time for the next one, this time in Lisbon. Last year, I wrote:

In 2019, I wasn’t sure whether I would go. This time, I was sure that I would. It had been too long since I saw everyone, and there were some useful discussions to be had. I think that overall the summit was a success, and I’m happy with the outcomes. We left with a few loose threads, but I’m feeling hopeful that they can, mostly, get tied up.

Months later, I did not feel hopeful. They were left dangling, and I felt like some of the best work I did was not getting any value. I was grouchy about it, and figured I was done. Then, though, I started thinking that there was one last project I’d like doing for PAUSE: Upgrading the server. It’s the thing I said I wanted to do last year, but barely even started. This year, I said that if we could get buy-in to do it, I’d go. Since I’m writing this blog post, you know I went, and I’m going to tell you about it.

PAUSE Bootstrap

Last year, Matthew and I wanted to make it possible to quickly spin up a working PAUSE environment, so we could replace the long-suffering “pause2” server. We were excited by the idea of starting from work that Kenichi Ishigaki had done to create a Docker container running a test instance. We only ended up doing a little work on that, partly because we thought we’d be starting from scratch and didn’t know enough Docker to be useful.

This year, we decided it’d be our whole mission. We also said that we were not going to start with Docker. Docker made sense, it was probably a great way to do it, but Matthew and I still aren’t Docker users. We wanted results, and we felt the way to get them was to stick to what we know: automated installation and configuration of an actual VM. We pitched this plan to Robert Spier, one of the operators of the Perl NOC and he was on board. I leaned on him pretty hard to actually come to Lisbon and help, and he agreed. (He also said that a sufficiently straightforward installer would be a good starting point for turning things into Docker containers later, which was reassuring.)

At Fastmail, where Matthew and I work, we can take every other Friday for experimental or out-of-band work, and we decided we’d get started early. If the installer was done by the time we arrived, we’d be in a great position to actually ship. This was a great choice. Matthew and I, with help from another Fastmail colleague, Marcus, wrote a program. It started off life as unpause, but is now in the repo as bootstrap/mkpause. You can read the PAUSE Bootstrap README if you want to skip to “how do I use this?”.

The idea is that there’s a program to run on a fresh Debian 12 box. That installs all the needed apt packages, configures services, sets up Let’s Encrypt, creates unix users, builds a new perl, installs systemd services, and gets everything running. There’s another program that can create that fresh Debian 12 box for you, using the DigitalOcean API. (PAUSE doesn’t run in DigitalOcean, but Fastmail has an account that made it easy to use for development.)

I think Matthew and I worked well together on this. We found different rabbit holes interesting. He fixed hard problems I was (barely) content to suffer with. (There was some interesting nonsense with the state of apt locking and journald behavior shortly after VM “cloud init”.) I slogged through testing exactly whether each cron job ran correctly and got a pre-built perl environment ready for quick download, to avoid running plenv and cpanm during install.

Before we even arrived, we could go from zero to a fully running private PAUSE server in about two and a half minutes! Quick builds meant we could iterate much faster. We also had a script to import all of PAUSE’s data from the live PAUSE. It took about ten minutes to run, but we had it down to one minute by day two.

When we arrived, I took my todo and threw it up on the wall in the form of a sticky note kanban board.

PTS Stickies: Day 1

We spent day one re-testing cron jobs, improving import speed, and (especially) asking Andreas König all kinds of questions about things we’d skipped out of confusion. More on those below, but without Andreas, we could easily have broken or ignored critical bits of the system.

By the end of day two, we were confident that we could deploy the next day. I’d hoped we could deploy on day two, but there were just too many bits that were not quite ready. Robert had spent a bunch of time running the installer on the VM where he intended to run the new production PAUSE service, known at the event as “pause3”. There were networking things to tweak, and especially storage volume management. This required the rejiggering of a bunch of paths, exposing fun bugs or incorrect assumptions.

The first thing we did on day three was start reviewing our list of pre-deploy acceptance tests. Did everything on the list work? We thought so. We took down pause2 for maintenance at 10:00, resynchronized everything, watched a lot of logs, and did some uploads. We got some other attendees to upload things to pause3. Everything looked good, so we cut over to pause3. It worked! We were done! Sort of.

We had some more snags to work through, but it was just the usual nonsense. A service was logging to the wrong place. The new MySQL was stricter about data validation than the old one. An accidental button-push took down networking on the VM. Everything got worked out in the end. I’ll include some “weird stuff that happened” below, but the short version is: it went really smoothly, for this kind of work.

On day four, we got to work on fit and finish. We cleaned up logging noise, we applied some small merge requests that we’d piled up while trying to ship. We improved the installer to move more configuration into files, instead of being inlined in the installer. Also, we prepared pull requests to delete about 20,000 lines of totally unused files. This is huge. When trying to learn how an older codebase works, it can be really useful to just grep the code for likely variable names or known subroutines. When tens of thousands of lines in the code base are unused, part of the job becomes separating live code out from dead code, instead of solving a problem.

We also overhauled a lot of documentation. It was exciting to replace the long and bit-rotted “how to install a private PAUSE” with something that basically said “run this program”. It doesn’t just say that, though, and now it’s accurate and written from the last successful execution of the process. You can read how to install PAUSE yourself.

Matthew, Robert, and I celebrated a successful PTS by heading off to Belém Tower to see the sights and eat pastéis.

I should make clear, finally, that the PAUSE team was five people. Andreas König and Kenichi Ishigaki were largely working on other goals not listed here. It was great to have them there for help on our work, but they got other things done, not documented in this post!

Here’s our kanban board from the end of day four:

PTS Stickies: Day 4

Specifics of Note

This was one of the two mirroring-related scripts we had to look into. It was bananas. Turns out that PAUSE had a list of users who ran their own FTP servers. It would, four times a day, connect to those servers and retrieve files from them directly into the users’ home directories on PAUSE.

Beyond the general bananas-ness of this, the underlying non-PAUSE program in /usr/bin/mirror no longer runs, as it uses $*, eliminated back in v5.30. Rather than fix it and keep something barely used and super weird around, we eliminated this feature. (I say “barely used”, but I found no evidence it was used at all.)

The other mirror program! This one updated the YAML file that exposes the CPAN mirror list. Years ago, the mirror list was eliminated, and a single name now points to a CDN. Still, we were diligently updating the mirror list every hour. No longer.


You can rsync from CPAN, but it’s even better to use rrr. With rrr, the PAUSE server is meant to maintain a few lists of “files that changed in a given time window”. Other machines can then synchronize only files that have changed since they last checked, with occasionally full-scan reindexes.

We got this working pretty quickly, but it seemed to break at the last minute. What had happened? We couldn’t tell, everything looked great, and there were no errors. Eventually, I found myself using strace against perl. It turned out that during our reorganization of the filesystem, we’d moved where the locks live. We put in a symlink for the old name, and that’s what rrr was using… but it didn’t follow symlinks when locking. Once we updated the configuration to use the canonical name and not the link, everything worked.

Matthew said, “You solved a problem with strace!” I said, “I know!” Then we high fived and got back to work.

I was never happy with the symlinks we introduced during the filesystem reorganization, but I was happy when I eliminated the last one during day four cleanup!

the root partition filled up

We did all this work to keep the data partition capable of growth, and then / filled up. Ugh.

It turned out it was logs. This wasn’t too much of a surprise, but it was annoying. It was especially annoying because we decided early on that we’d just accept using journald for all our logging, and that should’ve kept us from going over quota.

It turned out that on the VM, something had installed a service I’d never heard of. Its job was to notice when something wanted to use the named syslog socket, and then start rsyslogd. Once that happened, we were double-logging a ton of stuff, and there was no log rotation configured. We killed it off.

We did other tuning to make sure we’d keep enough logs without running out of space, but this was the interesting part.

Future Plans

We have some. If nothing else, I’m dying to see my pull request 405 merged. (It’s the thing I wrote last year.) I have a bunch of half-done work that will be easier to finish after that. But the problem was: would this wait another year?

We finished our day — just before heading off to Belém — by talking about development between now and then. I said, “Look, I feel really demotivated and uninterested if I can’t continuously ship and review real improvements.” Andreas said, “I don’t want to see things change out from under me without understanding what happened.”

The five of us agreed to create a private PAUSE operations mailing list where we’d announce (or propose) changes and problems. We all joined, along with Neil Bowers, who is an important part of the PAUSE team but couldn’t attend Lisbon. With that, we felt good about keeping improvements flowing through the year. Robert has been shipping fixes to log noise. I’ve got a significant improvement to email handling in the wings. It’s looking like an exciting year ahead for PAUSE! (That said, it’s still PAUSE. Don’t expect miracles, okay?)

Thanks to our sponsors and organizers

The Perl Toolchain Summit is one of the most important events in the year for Perl. A lot of key projects have folks get together to get things done. Some of them are working all year, and use this time for deep dives or big lifts. Others (like PAUSE) are often pretty quiet throughout the year, and use this time to do everything they need to do for the year.

Those of us doing stuff need a place to work, and we need to a way to get there and sleep, and we’re also pretty keen on having a nice meal or two together. Our sponsors and organizers make that possible. Our sponsors provide much-needed money to the organizers, and the organizers turn that money into concrete things like “meeting rooms” and “plane tickets”.

I offer my sincere thanks to our organizers: Laurent Boivin, Philippe Bruhat, and Breno de Oliveira, and also to our sponsors. This year, the organizers have divided sponsors into those who handed over cash and those who provided in-kind donation, like people’s time or paying attendee’s airfare and hotel bills directly. All these organizations and people are helping to keep Perl’s toolchain operational and improving. Here’s the breakdown:

Monetary sponsors:, The Perl and Raku Foundation, Deriv, cPanel, Inc Japan Perl Association, Perl-Services, Simplelists Ltd, Ctrl O Ltd, Findus Internet-OPAC, Harald Joerg, Steven Schubiger.

In kind sponsors: Fastmail, Grant Street Group, Deft, Procura, Healex GmbH, SUSE, Zoopla.

Breno especially should get called out for organizing this from five thousand miles away. You never could’ve guessed, and it ran exceptionally smoothly. Also, it meant I got to see Lisbon, which was a terrific city that I probably would not have visited any time soon otherwise. Thanks, Breno!

List of new CPAN distributions – Apr 2024


Published by perlancar on Wednesday 01 May 2024 02:38

dist author abstract date
AI-Ollama-Client CORION Client for AI::Ollama 2024-04-05T09:15:33
Acme-CPANModules-BPOM-FoodRegistration PERLANCAR List of modules and utilities related to Food Registration at BPOM 2024-04-27T00:06:16
Acme-CPANModules-JSONVariants PERLANCAR List of JSON variants/extensions 2024-04-29T00:05:46
Alien-NLOpt DJERIUS Build and Install the NLOpt library 2024-04-28T00:59:11
Alien-onnxruntime EGOR Discover or download and install onnxruntime (ONNX Runtime is a cross-platform inference and training machine-learning accelerator.) 2024-04-17T22:03:45
AnyEvent-I3X-Workspace-OnDemand WATERKIP An I3 workspace loader 2024-04-12T18:33:21
App-papersway SPWHITTON PaperWM-like window management for Sway/i3wm 2024-04-12T08:18:00
App-sort_by_comparer PERLANCAR Sort lines of text by a Comparer module 2024-04-16T00:06:00
App-sort_by_example PERLANCAR Sort lines of text by example 2024-04-20T00:05:10
App-sort_by_sorter PERLANCAR Sort lines of text by a Sorter module 2024-04-17T00:05:42
App-sort_by_sortkey PERLANCAR Sort lines of text by a SortKey module 2024-04-24T00:06:38
Arithmetic-PaperAndPencil JFORGET simulating paper and pencil techniques for basic arithmetic operations 2024-04-22T19:57:44
Bencher-Scenario-ExceptionHandling PERLANCAR Benchmark various ways to do exception handling in Perl 2024-04-13T00:05:36
CPAN-Requirements-Dynamic LEONT Dynamic prerequisites in meta files 2024-04-27T15:17:57
CSAF GDT Common Security Advisory Framework 2024-04-23T21:49:42
CXC-DB-DDL DJERIUS DDL for table creation, based on SQL::Translator::Schema 2024-04-04T16:24:13
Captcha-Stateless-Text HIGHTOWE stateless, text-based CAPTCHAs 2024-04-17T21:19:21
Carp-Object DAMI a replacement for Carp or Carp::Clan, object-oriented 2024-04-28T17:58:22
Carp-Patch-OutputToBrowser PERLANCAR Output stacktrace to browser as HTML instead of returning it 2024-04-25T00:05:19
Catalyst-Plugin-Flash ARISTOTLE put values on the stash of the next request 2024-04-09T05:06:19
Comparer-date_in_text PERLANCAR Compare date found in text (or text asciibetically, if no date is found) 2024-04-18T00:05:43
Crypt-Passphrase-Bcrypt-Compat LEONT A bcrypt encoder for Crypt::Passphrase 2024-04-08T14:24:10
DBD-Mock-Session-GenerateFixtures UXYZAB When a real DBI database handle ($dbh) is provided, the module generates DBD::Mock::Session data. Otherwise, it returns a DBD::Mock::Session object populated with generated data. This not a part form DBD::Mock::Session distribution just a wrapper around it. 2024-04-29T18:25:02
Data-Dumper-UnDumper BIGPRESH load Data::Dumper output, including self-references 2024-04-25T21:42:30
Data-MiniDumpX PERLANCAR A simplistic data structure dumper (demo for Plugin::System) 2024-04-14T00:06:13
DateTime-Format-PDF SKIM PDF DateTime Parser and Formatter. 2024-04-01T09:23:07
Devel-Confess-Patch-UseDataDumpHTMLCollapsible PERLANCAR Use Data::Dump::HTML::Collapsible to stringify reference 2024-04-26T00:05:16
Devel-Confess-Patch-UseDataDumpHTMLPopUp PERLANCAR Use Data::Dump::HTML::PopUp to stringify reference 2024-04-28T00:06:05
Dist-Build LEONT A modern module builder, author tools not included! 2024-04-26T10:50:10
Dist-Zilla-Plugin-DistBuild LEONT Build a Build.PL that uses Dist::Build 2024-04-26T10:55:35
Dist-Zilla-Plugin-DynamicPrereqs-Meta LEONT Add dynamic prereqs to to the metadata in our Dist::Zilla build 2024-04-27T15:50:03
ExtUtils-Builder LEONT An overview of the foundations of the ExtUtils::Builder Plan framework 2024-04-25T12:14:45
ExtUtils-Builder-Compiler LEONT Portable compilation 2024-04-25T13:18:11
JSON-Ordered-Conditional LNATION A conditional language within an ordered JSON struct 2024-04-06T06:47:37
JSON-ToHTML ARISTOTLE render JSON-based Perl datastructures as HTML tables 2024-04-09T04:28:11
Knowledge RSPIER a great new dist 2024-04-27T11:13:53
Log-Any-Simple MATHIAS A very thin wrapper around Log::Any, using a functional interface that dies automatically when you log above a given level. 2024-04-24T19:51:03
Mo-utils-Country SKIM Mo country utilities. 2024-04-11T13:41:33
Mo-utils-Time SKIM Mo time utilities. 2024-04-12T14:28:06
Mo-utils-TimeZone SKIM Mo timezone utilities. 2024-04-03T16:34:52
Mojolicious-Plugin-Authentication-OIDC TYRRMINAL OpenID Connect implementation integrated into Mojolicious 2024-04-25T19:27:09
Mojolicious-Plugin-Cron-Scheduler TYRRMINAL Mojolicious Plugin that wraps Mojolicious::Plugin::Cron for job configurability 2024-04-16T11:48:54
Mojolicious-Plugin-Migration-Sqitch TYRRMINAL Run Sqitch database migrations from a Mojo app 2024-04-30T15:37:52
Mojolicious-Plugin-Module-Loader TYRRMINAL Automatically load mojolicious namespaces 2024-04-19T14:09:36
Mojolicious-Plugin-ORM-DBIx TYRRMINAL Easily load and access DBIx::Class functionality in Mojolicious apps 2024-04-03T13:32:06
Mojolicious-Plugin-SendEmail TYRRMINAL Easily send emails from Mojolicious applications 2024-04-01T20:40:24
Mojolicious-Plugin-Sessionless TYRRMINAL Installs noop handlers to disable Mojolicious sessions 2024-04-16T12:45:37
MooX-Pack LNATION The great new MooX::Pack! 2024-04-20T01:52:17
Net-Async-OpenExchRates VNEALV Interaction with OpenExchangeRates API 2024-04-20T11:46:28
Net-EPP-Server GBROWN A simple EPP server implementation. 2024-04-08T09:38:21
Number-Iterator LNATION The great new Number::Iterator! 2024-04-18T19:45:31
Parallel-TaskExecutor MATHIAS Cross-platform executor for parallel tasks executed in forked processes 2024-04-13T20:02:27
Plack-App-Login-Request SKIM Plack application for request of login information. 2024-04-29T14:23:02
Sah-SchemaBundle-Business-ID-BCA PERLANCAR Sah schemas related to BCA (Bank Central Asia) bank 2024-04-23T00:05:53
Sah-SchemaBundle-Business-ID-Mandiri PERLANCAR Sah schemas related to Mandiri bank 2024-04-30T00:05:43
Sah-SchemaBundle-Comparer PERLANCAR Sah schemas related to Comparer 2024-04-21T00:05:30
Sah-SchemaBundle-Path PERLANCAR Schemas related to filesystem path 2024-04-01T00:06:15
Sah-SchemaBundle-Perl PERLANCAR Sah schemas related to Perl 2024-04-02T00:05:40
Sah-SchemaBundle-SortKey PERLANCAR Sah schemas related to SortKey 2024-04-22T00:06:02
Sah-SchemaBundle-Sorter PERLANCAR Sah schemas related to Sorter 2024-04-03T00:14:57
Sah-Schemas-Sorter PERLANCAR Sah schemas related to Sorter 2024-04-03T00:05:43
Seven LNATION The great new Seven! 2024-04-13T03:30:11
Sort-Key-SortKey PERLANCAR Thin wrapper for Sort::Key to easily use SortKey::* 2024-04-04T00:05:05
SortExample-Color-Rainbow-EN PERLANCAR Ordered list of names of colors in the rainbow, in English 2024-04-05T00:06:12
SortKey-Num-pattern_count PERLANCAR Number of occurrences of string/regexp pattern as sort key 2024-04-06T00:05:41
SortKey-Num-similarity PERLANCAR Similarity to a reference string as sort key 2024-04-08T00:05:21
SortKey-date_in_text PERLANCAR Date found in text as sort key 2024-04-19T00:05:23
SortSpec PERLANCAR Specification of sort specification 2024-04-09T00:05:37
SortSpec-Perl-CPAN-ChangesGroup-PERLANCAR PERLANCAR Specification to sort changes group heading PERLANCAR-style 2024-04-10T00:05:24
Sorter-from_comparer PERLANCAR Sort by comparer generated by a Comparer:: module 2024-04-11T00:05:17
Sorter-from_sortkey PERLANCAR Sort by keys generated by a SortKey:: module 2024-04-12T00:05:58
Sqids MYSOCIETY generate short unique identifiers from numbers 2024-04-06T10:43:27
TableData-Business-ID-BPOM-FoodAdditive PERLANCAR Food additives in BPOM 2024-04-10T11:10:00
Tags-HTML-Image SKIM Tags helper class for image presentation. 2024-04-20T13:32:39
Tags-HTML-Login-Request SKIM Tags helper for login request. 2024-04-29T11:23:37
Test2-Tools-MIDI JMATES test MIDI file contents 2024-04-09T23:42:34
Tiny-Prof TIMKA Perl profiling made simple to use. 2024-04-26T07:19:38
Web-Async TEAM Future-based web+HTTP handling 2024-04-23T16:50:24
YAML-Ordered-Conditional LNATION A conditional language within an ordered YAML struct 2024-04-06T06:05:51
kraken PHILIPPE connector 2024-04-05T09:11:35
papersway SPWHITTON PaperWM-like window management for Sway/i3wm 2024-04-12T07:52:39


Number of new CPAN distributions this period: 81

Number of authors releasing new CPAN distributions this period: 26

Authors by number of new CPAN distributions this period:

No Author Distributions
4 SKIM 7
18 EGOR 1
19 TIMKA 1
20 TEAM 1
23 DAMI 1
26 GDT 1

What's new on CPAN - March 2024

Published on Tuesday 30 April 2024 21:00

Welcome to “What’s new on CPAN”, a curated look at last month’s new CPAN uploads for your reading and programming pleasure. Enjoy!

APIs & Apps


Development & Version Control

Science & Mathematics


(cdxciii) 15 great CPAN modules released last week


Published by Unknown on Sunday 28 April 2024 09:07

Updates for great CPAN modules released last week. A module is considered great if its favorites count is greater or equal than 12.

  1. App::Netdisco - An open source web-based network management tool.
    • Version: 2.076001 on 2024-04-24, with 16 votes
    • Previous CPAN version: 2.075003 was 12 days before
    • Author: OLIVER
  2. Devel::Cover - Code coverage metrics for Perl
    • Version: 1.42 on 2024-04-26, with 101 votes
    • Previous CPAN version: 1.40 was 11 months, 26 days before
    • Author: PJCJ
  3. Devel::Size - Perl extension for finding the memory usage of Perl variables
    • Version: 0.84 on 2024-04-25, with 21 votes
    • Previous CPAN version: 0.83 was 5 years, 2 days before
    • Author: NWCLARK
  4. experimental - Experimental features made easy
    • Version: 0.032 on 2024-04-25, with 32 votes
    • Previous CPAN version: 0.031 was 1 year, 2 months, 25 days before
    • Author: LEONT
  5. HTML5::DOM - Super fast html5 DOM library with css selectors (based on Modest/MyHTML)
    • Version: 1.26 on 2024-04-25, with 12 votes
    • Previous CPAN version: 1.25 was 2 years, 9 months, 19 days before
    • Author: ZHUMARIN
  6. Compress::Zlib - IO Interface to compressed data files/buffers
    • Version: 2.212 on 2024-04-27, with 16 votes
    • Previous CPAN version: 2.211 was 21 days before
    • Author: PMQS
  7. JSON::Path - search nested hashref/arrayref structures using JSONPath
    • Version: 1.0.6 on 2024-04-26, with 12 votes
    • Previous CPAN version: 1.0.4 was 4 months, 15 days before
    • Author: POPEFELIX
  8. MIME::Body - Tools to manipulate MIME messages
    • Version: 5.515 on 2024-04-24, with 13 votes
    • Previous CPAN version: 5.514 was 2 months, 18 days before
    • Author: DSKOLL
  9. Module::CoreList - what modules shipped with versions of perl
    • Version: 5.20240420 on 2024-04-27, with 43 votes
    • Previous CPAN version: 5.20240320 was 1 month, 7 days before
    • Author: BINGOS
  10. PDL - Perl Data Language
    • Version: 2.088 on 2024-04-21, with 52 votes
    • Previous CPAN version: 2.019 was 5 years, 11 months, 16 days before
    • Author: ETJ
  11. SPVM - The SPVM Language
    • Version: 0.990001 on 2024-04-26, with 31 votes
    • Previous CPAN version: 0.989104 was 6 days before
    • Author: KIMOTO
  12. Test::MockModule - Override subroutines in a module for unit testing
    • Version: v0.178.0 on 2024-04-26, with 17 votes
    • Previous CPAN version: v0.177.0 was 2 years, 7 months, 19 days before
    • Author: GFRANKS
  13. Test::Simple - Basic utilities for writing tests.
    • Version: 1.302199 on 2024-04-25, with 190 votes
    • Previous CPAN version: 1.302198 was 4 months, 25 days before
    • Author: EXODIST
  14. Test2::Suite - Distribution with a rich set of tools built upon the Test2 framework.
    • Version: 0.000162 on 2024-04-25, with 47 votes
    • Previous CPAN version: 0.000159 was 6 months before
    • Author: EXODIST
  15. version - Structured version objects
    • Version: 0.9931 on 2024-04-27, with 21 votes
    • Previous CPAN version: 0.9930 was 7 months, 16 days before
    • Author: LEONT

TPRC Call for volunteers

Perl Foundation News

Published by Amber Krawczyk on Saturday 27 April 2024 11:36

We hope you are coming to [The Perl and Raku Conference[( in Las Vegas June 24-28! Plans are underway for a wonderful TPRC. But a conference of this type is only possible because of volunteers who give their time and expertise to plan, promote, and execute every detail. We need volunteers! You may have already volunteered to speak at the conference; if so, wonderful! If you are not presenting (or even if you are), there are many ways to help. We need people to set up and take down, to run the registration desk, to serve as room monitors, to help record the talks, and to just be extra hands. If you can spare some of your time for the sake of the conference, please fill out a volunteer form at . We also welcome spouses and friends of attendees who might be coming along to Las Vegas to share the experience. We are offering TPRC "companion" tickets, for access to the social parts of the conference (food, drink, parties) but not the technical. Volunteers of at least one complete day, who sign up before the conference, will have companion access "comped". If you have questions about volunteering, please contact our TPRC Volunteer Coordinator: Sarah Gray

Grant Application: RakuAST

Perl Foundation News

Published by Saif Ahmed on Friday 26 April 2024 15:18

Another Grant Application from a key Raku develoer, Stefan Seifert. A member of the Raku Steering Council, Stefan is also an author of several Perl 5 modules including Inline::Python and (of course) Inline::Perl6. This Grant is to help advance AST or Abstract Syntax Tree. This is integral to Raku internals and allows designing and implementation of new language components, that can be converted into bytecode for execution by the interpreteter or "virtual machine" more easily that trying to rewrite the interpretter. Here is an excellent intro by Elizabeth Mattijsen

Project Title: Taking RakuAST over the finish line


There is a grant called RakuAST granted to Johnathan Worthington that is still listed as running. Sadly Johnathan has moved on and is no longer actively developing the Rakudo core. However the goal of his grant is still worthy as it is one of the strategic initiatives providing numerous benefits to the language. I have in fact already taken over his work on RakuAST and over the last two years have pushed some 450+ commits which led to hundreds of spectests to pass. This work was done in my spare time which was possible because I had a good and reliable source of income and could at times sneak in some Raku work into my dayjob. I can no longer claim that Raku is in any way connected to my day job and time invested in Raku comes directly out of the pool that should ensure my financial future. In other words, there's a real cost for me and I'd like to ask for this to be offset by way of a grant.

Benefits to Raku

This is mostly directly taken from the RakuAST grant proposal as the goal stays the same:

An AST can be thought of as a document object model for a programming language. The goal of RakuAST is to provide an AST that is part of the Raku language specification, and thus can be relied upon by the language user. Such an AST is a prerequisite for a useful implementation of macros that actually solve practical problems, but also offers further powerful opportunities for the module developer. For example:

  • Modules that use Raku as a translation target (for example, ECMA262Regex, a dependency of JSON::Schema) can produce a tree representation to EVAL rather than a string. This is more efficient, more secure, and more robust. (In the standard library, this could also be used to realize a more efficient sprintf implementation.)
  • A web framework such as Cro could obtain program elements involved in validation, and translate a typical subset of them into JavaScript (or patterns for the HTML5 pattern attribute) to provide client side validation automatically.

RakuAST will also become the initial internal representation of Raku programs used by Rakudo itself. That in turn gives an opportunity to improve the compiler. The frontend compiler architecture of Rakudo has changed little in the last 10 years. Naturally, those working on it have learned a few things in that time, and implementing RakuAST provides a chance to fold those learnings into the compiler. Better static optimization, use of parallel processing in the compiler, and improvements to memory and time efficiency are all quite reasonable expectations. We have already seen that the better internal structure fixes a few long standing bugs incidentally. However, before many of those benefits can be realized, the work of designing and implementing RakuAST, such that the object model covers the entire semantic and declarational space of the language, must take place. This grant focuses on that work.

Project Details

  1. Based on previous development velocity I expect do do some 200 more commits before the RakuAST based compiler frontend passes both Rakudo's test and the Raku spectest suites.
  2. Once the test suites pass, there will be some additional work needed to compile Rakudo itself with the RakuAST-frontend. This work will center around bootstrapping issues.

Considering the amount of work these items already will be, I would specifically exclude work targeted at synthetic AST generation, designs for new macros based on this AST, and anything else that is not strictly necessary to reach the goal of the RakuAST compiler frontend becoming the default.


For the test and spectest suites I would continue my tried and proven model of picking the next failing test file and making fixes until it passes. Based on current velocity this will take around 6 months. However there's hope that some community members will return from their side projects and chime in.

Amount Requested

$10,000 for an estimated 200 hours of work.


I have been involved in Rakudo development since 2014 when I started development of Inline::Perl5 which brings full two-way interoperability between Raku and Perl. Since then I have helped with every major effort in Rakudo core development like the Great List Refactor, the new dispatch mechanism and full support for unsigned native integers. I have fixed hundreds of bugs in MoarVM including garbage collection issues, race conditions and bugs in the specializer. I have made NativeCall several orders of magnitude faster by writing a special dispatcher and support for JIT compiling native calls. I replaced a slow and memory hungry MAST step in the compilation process by writing bytecode directly, have written most of Rakudo's module loading and repository management code and in general have done everything I could to make Rakudo production worthy. I have also been a member of the Raku Steering Council since its inception.


Elizabeth Mattijsen, Geoffrey Broadwell, Nick Logan, Richard Hainsworth

Explicit vs Implicit Hooks

domm (Perl and other tech)

Published on Monday 22 April 2024 09:00

At the Koha Hackfest I had several discussions with various colleagues about how to improve the way plugins and hooks are implemented in Koha. I have worked with and implemented various different systems in my ~25 years of Perl, so I have some opinions on this topic.

What are Hooks and Plugins?

When you have some generic piece of code (eg a framework or a big application that will be used by different user groups (like Koha)), people will want to add custom logic to it. But this custom logic will probably not make sense to every user. And you probably don't want all of these weird adaptions in the core code. So you allow users to write their weird adaptions in Plugins, which will be called via Hooks in the core code base. This patter is used by a lot of software, from eg mod_perl/Apache, Media Players to JavaScript frontend frameworks like Vue.

Generally, there are two kinds of Hook philosophies: Explicit Hooks, where you add explicit calls to the hook to the core code; and Implicit Hooks, where some magic is used to call Plugins.

Explicit Hooks

Explicit Hooks are rather easy to understand and implement:

package MyApp::Model::SomeThing;

method create ($args) {
    $self->call_hook("pre_create", $args);

    my $item = $self->resultset("SomeThing")->create( $args );
    $self->call_hook("post_create", $args, $item);
    return $item;

So you have a method create which takes some $args. It first calls the pre_create hook, which could munge the $args. Then it does what the Core implementation wants to do (in this case, create a new item in the database). After that it calls the post_create hook which could do further stuff, but now also has the freshly created database row available.

The big advantage of explicit hooks is that you can immediately see which hook is called when & where. The downside is of course that you have to pepper your code with a lot of explicit calls, which can be very verbose, especially once you add error handling and maybe a way for the hook to tell the core code to abort processing etc. Our nice, compact and easy to understand Perl code will end up looking like Go code (where you have to do error handling after each function call)

Implicit Hooks

Implicit hooks are a bit more magic, because the usually do not need any adaptions to the core code:

package MyApp::Model::SomeThing;

method create ($args) {
    my $item = $self->resultset("Foo")->create( $args );
    return $item

There are lots of ways to implement the magic needed.

One well-known one is Object Orientation, where you can "just" provide a subclass which overrides the default method. Of course you will then have to re-implement the whole core method in your subclass, and figure out a way to tell the core system that it should actually use your subclass instead of the default one.

Moose allows for more fine-grained ways to override methods with it's method modifiers like before, after and around. If you also add Roles to the mix (or got all in with Parametric Roles) you can build some very abstract base classes (similar to Interfaces in other languages) and leave the actual implementation as an exercise to the user...

Coincidentally, at the German Perl Workshop Ralf Schwab presented how they used AUTOLOAD and a hierarchy of shadow classes to add a Plugin/Hook system to their Cosmo web shop (which seems to be also wildly installed and around for quite some time). (I haven't seen the talk, only the slides

I have some memories (not sure if fond or nightmarish) of a system I build between 1998 and 2004 which (ab)used the free access Perl provides to the symbol table to use some config data to dynamically generate classes, which could then later by subclassed for even more customization.

But whatever you use to implement them, the big disadvantage of Implicit Hooks is that it is rather hard to figure out when & why each piece of code is called. But to actually and properly use implicit hooks, you will also have to properly structure your code in your core classes into many small methods instead of big 100-line monsters, which also improves testabilty.

So which is better?

Generally, "it depends". But for Koha I think Explicit Hooks are better:

  • For a start, Koha already has a Plugin system using Explicit Hooks. Throwing this away (plus all the existing Plugins using this system) would be madness (unless switching to Implicit Hooks provides very convincing benefits, which I doubt).
  • Koha still has a bunch of rather large methods that do a lot and thus are not very easily subclassed or modified by dynamic code.
  • Koha also calls plugins from what are basically CGI scripts, so sometimes there isn't even a class or method available to modify (though this old code is constantly being modernized)
  • Handling all the corner cases of implicitly called hooks (like needing to call next or SUPER) might be a bit to much for some Plugin authors (who might be more on the librarian-who-can-code-a-bit side of the spectrum then on dev-who-happens-to-work-with-libraries)
  • A large code base like Koha's, which is often worked on by non-core-devs, needs to be greppable. But Implicit Hooks are basically invisible and don't show up when looking through the Core code.
  • But most importantly, because Explicit Hooks are boring technology, and I've learned in the last 10 years that boring > magic!

Using implicit hooks could maybe make sense if Koha

  • is refactored to have all it's code in classes that follow a logic class hierarchy and uses lots of small methods (which should be a goal in itself, independent of the Plugin system)
  • somebody comes up with a smart way to allow Plugin authors to not have to care about all weird corner cases and problems (like MRO and diamond inheritance, Plugin call order, the annoying syntax of things like around in Moose, error handling, ...).

An while it itches me in the fingers to do come up with such a smart system, I think currently dev time is better spend on other issues and improvements.

P.S.: I'm currently traveling trough Albania, so I might be slow to reply to any feedback.