Originally published at Perl Weekly 746
Hi there,
YAPC::Fukuoka 2025 is happening on 14-15 Nov 2025.
I'm also excited about LPW 2025. From our latest update from the organisers, the event is moving forward. They're making every effort to ensure it happens, which is no small feat given the short notice. What's particularly remarkable is that they're managing this with just a two-person team.
They truly need our support, so please do reach out if you can help. The organisers are currently seeking sponsors, volunteers and speakers. I've tentatively submitted a talk proposal myself.
Hopefully, I'll see you all at the event. The venue is expected to be confirmed this week. For the latest updates, please check the website.
Enjoy rest of the newsletter.
--
Your editor: Mohammad Sajid Anwar.
Announcements
YAPC::Fukuoka 2025
It's 2 days event, 14-15 Nov 2025. YAPC::Fukuoka 2025 will be the first time the event is held in Kyushu since YAPC::Fukuoka 2017 HAKATA.
The corner of Gabor
A couple of entries sneaked in by Gabor.
Adding tests to legacy Perl code
Online live-coding event.
Articles
Implementing Bitcoin in a dead language
An exceptional piece of technical writing that balances satire, technical depth and human vulnerability while showcasing significant software engineering accomplishment. It now implements BIP340 (Schnorr signatures), BIP341 (spending rules) and BIP342 (script validation).
A polymorphic quine
An exceptional deep dive into esoteric programming concepts that demonstrates profound computer science knowledge and creative problem-solving.
AWS S3 Bucket Events
Back to my favourite topic: AWS. In this post, I am showing how to tackle S3 bucket events using AWS Lambda.
CPAN
App::Test::Generator
This is a major improvement of the fuzz testing framework, a building tool that automatically generates comprehensive test suites from formal specifications.
Grants
PEVANS Core Perl 5: Grant Report for October 2025
Maintaining Perl (Tony Cook) October 2025
The Weekly Challenge
The Weekly Challenge by Mohammad Sajid Anwar will help you step out of your comfort-zone. You can even win prize money of $50 by participating in the weekly challenge. We pick one champion at the end of the month from among all of the contributors during the month, thanks to the sponsor Lance Wicks.
The Weekly Challenge - 347
Welcome to a new week with a couple of fun tasks "Format Date" and "Format Phone Number". 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 - 346
Enjoy a quick recap of last week's contributions by Team PWC dealing with the "Longest Parenthesis" and "Magic Expression" tasks in Perl and Raku. You will find plenty of solutions to keep you busy.
TWC346
For The Weekly Challenge, this is a strong, organised solutions post. Working code for both challenges is provided by Ali, who exhibits a straightforward and useful approach to problem-solving. The answers are clear and accurate.
Parenthesised Magic
This blog post is technically sound, informative and well-written. It successfully illustrates a typical Raku problem-solving technique: beginning with a simple, imperative approach and then refining it into a more idiomatic, succinct and potent functional solution.
Perl Weekly Challenge: Week 346
Jaldhar doesn't just provide solutions but explores multiple approaches for each problem, analysing trade-offs between readability, performance and idiomatic style. The post is rich with technical insights, performance benchmarks and clever algorithmic thinking, making it both educational and intellectually stimulating.
Magic Parentheses
This is an excellent, technically complex post that demonstrates sophisticated Perl programming methods. Jorg exhibits a thorough understanding of mathematical optimization, regex engines and effective algorithm design.
really not inspired!
Welcome back Luca after the break, nice hack about tracking nesting levels in Raku.
Perl Weekly Challenge 346
This is an excellent technical blog post that demonstrates deep algorithmic creativity and strong problem-solving skills. It's a genuinely novel approach that demonstrates deep understanding of the problem domain rather than just implementing standard algorithms.
Recursive Parentheses - But no Recursive Magic
This is a solid and insightful write-up by Matthias - concise, technically sound and pedagogically clear.
Whoa-oh-oh! Sing about parens!
This is a superb technical blog post that exhibits profound pedagogical understanding and remarkable programming proficiency in several languages.
(Magic)
This post blends practical implementation knowledge with sophisticated algorithms. Peter demonstrates a solid foundation in computer science and carefully weighs the pros and cons of various strategies.
All Aboard The Magic Parenthesis
This is a solid, practical technical blog post that demonstrates good problem-solving skills across multiple languages.
Longest Expression
Both tasks are implemented correctly, pedagogically and safely. The code favors clarity and correctness over performance, which makes sense for a challenge-focused context.
Rakudo
2025.44 Jimmy Wales on Audrey Tang
This is a high-quality community newsletter that successfully serves both technical and social aspects of the Raku ecosystem. It demonstrates an active, thoughtful community with meaningful technical content and important community developments.
Weekly collections
NICEPERL's lists
Great CPAN modules released last week;
MetaCPAN weekly report.
Events
Perl Maven online: Adding tests to legacy Perl code
November 11, 2025
Paris.pm monthly meeting
November 12, 2025
YAPC::Fukuoka 2025
November 14-15, 2025
London Perl and Raku Workshop
November 29, 2025
Toronto.pm - online - How SUSE is using Perl
December 6, 2025
Paris.pm monthly meeting
December 10, 2025
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.
Your complete tutorial for maximizing PERL opportunities this November.
Revert "bignum" This reverts commit d3cf8cc20a82be0573ee727a4f68b5ceb7170502. This got accidentally pushed when I instead meant to update maint-votes
bignum
'use 5.41' affects current line source::encoding Previously it didn't take effect until subsequent lines Fixes #23881
Update email address of Yitzchak Scott-Thoennes
Update source_encoding.t comment This feature was delayed until 5.41; the comment here was not updated to reflect that.
| submitted by /u/oalders [link] [comments] |

Tony writes:
``` [Hours] [Activity] 2025/10/02 Thursday 1.03 #23782 testing, comments 0.23 #23794 review change, research and comment 0.32 #23787 review and approve 0.27 #23777 review, research and comment 0.17 #23775 review and comment
0.48 #23608 research and comment
2.50
2025/10/03 Friday 1.30 #21877 code review, find another possible bug 0.08 #23787 review updates, has other approval, apply to blead 0.68 #21877 bug report rcatline - #23798 0.08 #23794 review updates and approve 0.08 #16865 follow-up
0.90 #23704 research and comment
3.12
2025/10/06 Monday 0.27 #23728 review and comment 0.60 #23752 review, testing and comment 0.15 #23813 review, but nothing further to say 0.18 #23809 comment 0.18 #21877 write more tests 0.07 #23817 review, got merged as I looked at it 0.22 #23795 start review
1.95 #23795 more review
3.62
2025/10/07 Tuesday 0.60 #23774 review 0.68 #23796 review and approve 0.37 #23797 review 0.08 #23797 finish review and approve 0.25 #23799 review and comment 0.12 #23800 review and approve 0.10 #23801 review and comment 0.17 #23802 comment 0.08 #23752 review and approve
0.60 #23795 more review
3.05
2025/10/08 Wednesday 0.55 #23795 more review 0.72 #23795 more review 0.12 #23782 marked resolved comments resolved
0.08 #23801 review updates and approve
1.47
2025/10/09 Thursday 0.45 #23799 comment 0.08 #23821 review and approve 0.08 #23824 review and approve 0.12 #23827 review, research and approve 0.10 #23820 review, research and comment 0.30 #23812 review, existing comment matches my opinion 0.10 #23805 briefly comment 2.30 #21877 add #23798 tests, testing, more work on re- implementation 1.67 #21877 work on re-implementation
0.55 #21877 more work
5.75
2025/10/10 Friday
0.23 #23828 review discussion and failing message, comment
0.23
2025/10/13 Monday 0.23 #23829 review discussion and comment 0.22 #23833 comment 0.20 #23834 review and approve with comment 0.42 #23837 review and approve 0.30 #23838 review and comment 0.42 #23840 review and comment 0.08 #23843 review and approve 0.15 #23842 review and comment 0.23 #23836 review test failures and comment 0.17 #23841 review discussion, research and comment 0.52 #23676 search for other possible modules, review and comment 0.13 #23833 review and comment 0.47 #21877 more tests, debugging 0.32 #23802 research, comment
1.18 #21877 debugging
5.04
2025/10/14 Tuesday 1.20 #23844 review, comments 0.15 #23845 review and approve 0.33 #21877 debugging 0.72 #21877 debugging, testing
0.67 #21877 debugging
3.07
2025/10/15 Wednesday
0.23 check coverity scan reports
0.23
2025/10/16 Thursday 0.55 #23847 review, #p5p discussion re 5.42.1, approve 0.53 #23851 review, research and comment, more maint-5.42 discussion 0.98 #23850 review, comments 0.53 #23852 research and comment
0.37 maint votes: vote and look for anything else
2.96
2025/10/20 Monday 0.35 #23840 review updates and approve 0.78 #23838 review updates, review build logs, comments 0.33 #23833 investigate build errors and warnings, restart mingw64 CI 0.08 #23818 review updates and approve 0.28 #23851 research and comments
1.97 #23795 more review
3.79
2025/10/21 Tuesday 0.12 #23838 check updates, restart failed CI job 0.38 #23853 review, research and comment 0.62 #23865 review, coverage testing and approve 1.13 #23858 review, testing, comments 0.08 #23838 check CI results and approve 1.07 #23795 more review and let dave know Iām done for now 1.08 #23852 work on re-working docs, research equivalence of
sigprocmask and pthread_sigmask, comment
4.48
2025/10/22 Wednesday 0.27 #23858 review updates and conditionally approve 0.27 #23868 review and approve 0.47 update t/test_pl.pod with the new PREAMBLE directive PR 23869 1.43 #23782 try to understand the code, minor change and testing
0.42 #23782 more testing, debugging
2.86
2025/10/23 Thursday
2.78 #23871 review, testing, comments
2.78
2025/10/27 Monday 2.80 #23871 review updates, comment, testing
0.43 #23795 comments
3.23
2025/10/28 Tuesday 0.40 #23879 review changes and research, comment on referred ticket 0.10 #23781 comment 0.08 #23809 briefly comment 0.67 #23867 review 0.45 #23867 comments
1.30 #23872 review
3.00
2025/10/29 Wednesday 1.10 #23782 testing and follow-up
0.53 #23781 re-check
1.63
2025/10/30 Thursday 0.35 #23882 review and comment 1.70 #23873 review, testing and approve 0.33 #23614 comment
1.55 #21877 debugging - fix one issue
3.93
Which I calculate is 56.74 hours.
Approximately 59 tickets were reviewed or worked on, and 1 patches were applied. ```
I'm running into a weird import error message while trying to create a commandline tool that references packages within a Perl web application. The web application itself is working fine. I can reproduce the issue with an MVE, but I'm mostly interested in understanding what is going on because it makes no sense to me. It's easy to "fix" this MVE by playing around with the imports but this isn't working with the real program, and I'd also prefer to avoid changing the application packages (i.e. the real AllZip.pm).
This is perl 5, version 40, subversion 1 (v5.40.1), running on Windows 11. This was locally compiled with the modules built using cpanm.
AllZip.pm
package AllZip;
use strict;
use warnings;
use IO::Uncompress::Unzip qw(unzip $UnzipError);
use Archive::Zip::SimpleZip qw($SimpleZipError);
1;
test.pl:
package test;
use strict;
use warnings;
use Carp;
use AllZip; #Line 7
use IO::Compress::Gzip qw(:constants gzip $GzipError); #Line 9
use IO::Compress::Zip 2.213 qw(:all); #Line 10 (taken from Archive::Zip::SimpleZip)
print (($GzipError // '') . " is imported.\n");
print (($ZipError // '') . " is imported.\n");
Running this as-is gives the error:
"$GzipError" is not exported by the IO::Compress::Zip module
"gzip" is not exported by the IO::Compress::Zip module
Can't continue after import errors at test.pl line 10.
BEGIN failed--compilation aborted at test.pl line 10.
Which is strange, because I'm not asking for gzip or $GzipError from IO::Compress::Zip.
The print statements are just to verify that the exports are working. If I comment out line 9 I get a syntax error stating that $GzipError isn't declared, which is expected.
The error goes away if I remove line 7. Changing the order of the Zip/GZip use statements results in multiple prototype mismatch errors but otherwise runs to completion (the real program does not).
Does the prior import of IO::Compress::Gzip somehow clobber the :all keyword when IO::Compress::Zip is re-imported?
@ikegami can replicate on Linux, and whittled it down to the following:
$ perl -e'
use IO::Compress::Zip qw();
use IO::Compress::Gzip qw();
use IO::Compress::Zip qw( :all ); # Line 4
'
"gzip" is not exported by the IO::Compress::Zip module
"$GzipError" is not exported by the IO::Compress::Zip module
Can't continue after import errors at -e line 4.
BEGIN failed--compilation aborted at -e line 4.
-
App::cpm - a fast CPAN module installer
- Version: 0.998000 on 2025-11-07, with 176 votes
- Previous CPAN version: 0.997024 was 3 months, 27 days before
- Author: SKAJI
-
App::Netdisco - An open source web-based network management tool.
- Version: 2.094003 on 2025-11-03, with 777 votes
- Previous CPAN version: 2.094002 was 5 days before
- Author: OLIVER
-
CPANSA::DB - the CPAN Security Advisory data as a Perl data structure, mostly for CPAN::Audit
- Version: 20251102.001 on 2025-11-02, with 25 votes
- Previous CPAN version: 20251026.001 was 7 days before
- Author: BRIANDFOY
-
Dist::Zilla - distribution builder; installer not included!
- Version: 6.034 on 2025-11-07, with 189 votes
- Previous CPAN version: 6.033 was 6 months, 5 days before
- Author: RJBS
-
PerlPowerTools - BSD utilities written in pure Perl
- Version: 1.053 on 2025-11-04, with 223 votes
- Previous CPAN version: 1.052 was 3 months, 17 days before
- Author: BRIANDFOY
-
Sys::Virt - libvirt Perl API
- Version: v11.8.0 on 2025-11-07, with 17 votes
- Previous CPAN version: v11.6.0 was 3 months, 3 days before
- Author: DANBERR
-
Test::Fatal - incredibly simple helpers for testing code with exceptions
- Version: 0.018 on 2025-11-06, with 40 votes
- Previous CPAN version: 0.017 was 2 years, 10 months, 5 days before
- Author: RJBS
-
Time::Piece - Object Oriented time objects
- Version: 1.40 on 2025-11-08, with 64 votes
- Previous CPAN version: 1.39 was 14 days before
- Author: ESAYM
-
Workflow - Simple, flexible system to implement workflows
- Version: 2.07 on 2025-11-08, with 34 votes
- Previous CPAN version: 2.06 was 2 months, 26 days before
- Author: JONASBN
This is the weekly favourites list of CPAN distributions. Votes count: 70
Week's winners (+5): DBD::DuckDB
Build date: 2025/11/08 17:43:57 GMT
Clicked for first time:
- App::Test::Generator - Generate fuzz and corpus-driven test harnesses
- Chart::ECharts - Apache ECharts wrapper for Perl
- Cwd::Guard - Temporary changing working directory (chdir)
- Eval::Context - Evalute perl code in context wrapper
- Image::WebP - binding to Google's libwebp.
- JSON::Schema::Validate - Lean, recursion-safe JSON Schema validator (Draft 2020-12)
- LaTeX::Replicase - Perl extension implementing a minimalistic engine for filling real TeX-LaTeX files that act as templates.
- OpenAPI::Linter - Lint and validate OpenAPI specification files
- Plack::Middleware::ConsoleLogger - Write logs to Firebug or Webkit Inspector
- Win32API::Process - Perl extension for handling the processes using the plain Win32 API
Increasing its reputation:
- abbreviation (+1=2)
- Alien (+1=5)
- App::cpanminus (+1=285)
- App::cpm (+1=77)
- App::perlimports (+1=21)
- Const::Fast (+1=36)
- CPAN::Meta (+1=27)
- Crypt::URandom (+1=7)
- Data::Dump (+1=42)
- Data::Password::zxcvbn (+1=8)
- DBD::DuckDB (+4=6)
- Devel::Cycle (+1=17)
- Devel::NYTProf (+1=195)
- Dist::Milla (+1=39)
- Dist::Zilla (+1=188)
- experimentals (+1=5)
- HTML::T5 (+1=2)
- HTTP::BrowserDetect (+1=26)
- HTTP::Message (+1=71)
- import (+1=3)
- Import::Into (+1=39)
- IO::Compress (+1=18)
- JQ::Lite (+3=7)
- Keyword::Declare (+1=24)
- Lexical::Persistence (+1=4)
- libwww::perl (+1=173)
- Mojo::PDF (+1=9)
- Mojo::Reactor::UV (+1=3)
- Mojolicious (+1=509)
- MooseX::Types::Set::Object (+1=2)
- namespace (+1=3)
- PAR::Packer (+1=45)
- Path::Iterator::Rule (+1=25)
- Path::Tiny (+1=193)
- Plack::Middleware::Debug (+1=20)
- Plack::Middleware::ETag (+1=4)
- Plack::Middleware::ReverseProxy (+1=9)
- Regexp::Common::net::CIDR (+1=2)
- Regexp::Debugger (+1=59)
- Reply (+1=61)
- Rex (+1=88)
- RT::Extension::CustomFieldsOnUpdate (+1=4)
- Safe (+1=13)
- strictures (+1=26)
- String::Random (+1=24)
- Syntax::Keyword::Match (+1=14)
- Syntax::Keyword::MultiSub (+1=5)
- Syntax::Keyword::Try (+1=46)
- Test2::Plugin::NoWarnings (+1=4)
- Test2::Plugin::SubtestFilter (+2=2)
- Test::Class (+1=24)
- Test::Simple (+1=199)
- Test::Simpler (+1=4)
- WWW::Mechanize (+1=103)
My fellow contributor @ehuelsmann located a regression since we spun off 2.X from 1.X.
The regression was observed by @ehuelsmann and he provided a PR with a fix.
The regression was a change to return values and one of the interesting Perl discussions on whether to return undef or just do return. Anyway the fix reinstates the previous behavior and returns undef.
Here follows the change log for the bug fix release.
2.07 2025-11-08 bug fix release, update not required
Fixed
This is a major improvement of the fuzz testing framework, a building tool that automatically generates comprehensive test suites from formal specifications. This release taught me some valuable lessons about edge cases in... well, edge case testing itself.
The highlights:
Improved input validation - I identified scenarios where empty constraint sets could cause silent failures. Explicit validation now catches configuration errors at generation time, rather than at test time.
The data transformation validator is now mature enough to be let loose. It will now properly handle complex types (arrayrefs, hashrefs, numbers) with realistic boundary conditions.
There is new comprehensive documentation for advanced features that were previously not well-documented and required knowledge of the code. In doing so, this release also deprecates unsafe patterns (loading untrusted Perl configs).
The release has fixed subtle bugs in regex matching, sprintf formatting, and Boolean handling that only surfaced under specific combinations of constraints.
The full release improves specification-driven testing for both functional and OO codebases, with better support for regex constraints, data transformations, and module validation.
[link] [comments]
| The README provides examples of Perl code with the font face. Itās worth a peek Hacker News discussion: https://news.ycombinator.com/item?id=45849342 [link] [comments] |
I thought it might be fun to write a "polymorphic virus", but that would involve learning executable file formats and machine code, which sounds like a lot of effort. So instead I went for the next best thing: Perl instead of machine code, and self-replicating code in the form of a quine rather than "infecting" other executables.
When you run this code, it will output a new version of itself, which you can run again to get another version, etc. Unlike a regular quine, which will produce an exact copy of its source code, this program is polymorphic: Its output is functionally identical to the original, but the code might look completely different. This is just a proof-of-concept, but it does try to introduce variations in all parts that a simple static scanner might use for detection (such as signatures in an antivirus). There are still fixed parts, but they're small and generic (such as ; or =) and can be found in most any perl script.
(my $Edw70Kp = "|ygn`hjs\nmo\\yjc]eyuy}YUl[h^y:YWyw\nmo\\ym`gnyu\nyyyygsy\"}mnl#y7y:Y5\nyyyyl_nolhymjlchn`\"{p~p^{&y}mnl#\nyyyyyyyyc`yl[h^\"#y6y*(,5\nyyyy}mnly7xymu\"UXy'xW#v\"U{V}V:VVW#wu\nyyyyyyyy^_`ch_^y},y9y{VV},{y4\nyyyyyyyy}+y_ky{Vh{y9y{VVh{y4\nyyyyyyyymjlchn`\"{VVr~*,r{&yil^y}+#\nyyyyw_a5\nyyyy!{!y(y}mnly(y!{!\nw\n\ngsy}p[ly7y!}!y(ydichy!!&yjc]e\"![!y((y!t!&y!;!y((y!T!&y!Y!#&yg[jyjc]e\"![!y((y!t!&y!;!y((y!T!&y!Y!&y!*!y((y!3!#&y'-y((yl[h^y++5\ngsy\"}ip[l#y7y}?^q1*Ejy7xy)7yV}\"Vq%#y7)5\n}?^q1*Ejy7xym)V}}ip[lV\\)}p[l)a5\n\ngsy}h_rny7yjc]e\"!!&y!gsy!&y!ioly!#y(y}p[ly(y!y!y(yjc]e\"!7!&y!(7!&y!vv7!#y(y!y!5\n\nc`y\"l[h^\"#y6y*(/#yu\nyyyygsy}ey7ydichy!!&yg[jyuy]blyl[h^y,/0ywy+y((yf_hanb\"}?^q1*Ej#5\nyyyy}h_rny(7ym`gn\"}e#y(y!yXy!y(ym`gn\"}eyXy}?^q1*Ej#5\nwy_fm_yu\nyyyygsy}lmy7yil^y{y{5\nyyyygsy}l_y7yil^y{x{5\nyyyygsy}lqy7y}l_y'y}lm5\nyyyygsy}^y7y+y%ychnyl[h^\"}lq#5\nyyyy\"gsy}^j_`y7y}?^q1*Ej#y7xym)\"Uy'xW#)]bl\"\"il^\"}+#y'y}lmy%y}lqy%y+y'y}^#y~y\"}lqy%y+#y%y}lm#)_a5\nyyyy}h_rny(7ym`gn\"}^j_`#5\nyyyygsy}hy7y]bl\"}lmy%y}^#5\nyyyy\"gsy}gy7y}h#y7xynl)z'xy)y'x)5\nyyyym)\"UV)V'VVW#)VV}+)ay`ily}g&y}h5\nyyyy}h_rny7y{\"}h_rn#y7xy{y(yjc]e\"!nl!&y!s!#y(y{)y'x)}h'xy'}g){5\nw\n}h_rny(7y!5y!5\n\n}h_rny(7yjc]e\"{_p[fy}p[l{&y{m)X)}p[l)__{#y(y{Vh{5\n\njlchny}h_rn5\n") =~ tr/ -~/&-~ -%/; eval $Edw70Kp

Back to my favourite topic AWS, today I am exploring AWS S3 Bucket Events.
Please check out the link for more information:
https://theweeklychallenge.org/blog/aws-s3-bucket-events
One of the most important thing in my work regarding software development is testing. That’s why whenever I picked up a new programming…

Paul writes:
The main event from this month has been getting the signature named parameters (PPC0024) branch finalised and merged.
- 4 = Improvements to unit tests around subroutine signatures
- https://github.com/Perl/perl5/pull/23822
- https://github.com/Perl/perl5/pull/23868
- 11 = Signature Named Parameters branch
- https://github.com/Perl/perl5/pull/23871
- 2 = Investigations into possible performance enhancements of pp_multiparam
- https://www.nntp.perl.org/group/perl.perl5.porters/2025/10/msg270428.html
- 1 = Improvements to named parameter error reporting
- https://github.com/Perl/perl5/pull/23888
- 2 = Other github code reviews
Total: 20 hours
My aim for November is to let the dust settle a bit on signature parameters, and turn my attention to either Magic v2 or Attributes v2, aiming to have something that can interact better with signatures in time for the 5.44 release.
I have started learning some frontend with vuejs recently, and as a start, built a to-do app with the tutorial from MDN…
Long story short I have written my own custom HTML template system that I am very happy with. However I have done that with manually concatenating HTML tags, and it is a bit messy. There has to be a perl library that will help you build a static HTML document and then output the result. But when I google for a solution I get plenty of options about parsing HTML documents, using templates to generate HTML, or frameworks to generate HTML pages dynamically, but I can't seem to find a perl library that you can generate an HTML document with. Does anybody have any suggestions?
When using the perl library Storable to store and retrieve XML::LibXML document objects, I get a segmentation fault. Specifically, once I use the LibXML routine findnodes. My question is: why, and is there a way around it?
For example consider the following code:
use strict;
use warnings;
use XML::LibXML;
use Storable;
use Devel::Size qw/size/;
use Data::Dumper qw/Dumper/;
my $file = "test.xml";
my $store_file = "./dom.xml.store";
my $dom;
if(-e $store_file ){
$dom = retrieve $store_file;
print "dom retrieved from storable $store_file\n";
}else{
$dom = XML::LibXML->load_xml(location => $file);
print "dom retrieved from xml $file\n";
store $dom, $store_file;
}
print Dumper $dom;
print "Dom ref(". ref($dom) . "), size(" . size($dom) . ")\n";
#test
foreach my $title ($dom->findnodes('//title')){
print $title->to_literal() . "\n";
}
Running this code twice yields the following result:
$~/perl:perl libxml.pl
dom retrieved from xml test.xml
$VAR1 = bless( do{\(my $o = '93874673292592')}, 'XML::LibXML::Document' );
Dom ref(XML::LibXML::Document), size(72)
Apollo 13
Solaris
Ender's Game
Interstellar
The Martian
$~/perl:perl libxml.pl
dom retrieved from storable ./dom.xml.store
$VAR1 = bless( do{\(my $o = '93874673292592')}, 'XML::LibXML::Document' );
Dom ref(XML::LibXML::Document), size(72)
Segmentation fault
$~/perl:
The xml file which I named test.xml file is the same file retrieved from the tutorial here. Similar tests were run on my system with unblessed and blessed perl objects, neither of which caused the segmentation fault.
Usual disclaimers: perl version: v5.26.3 Storable version 3.11 LibXML version 2.0132
Originally published at Perl Weekly 745
Hi there!
First of all, apologies. Apparently last edition included a link the source of the Perl IDE survey and not the actual Perl IDE Survey itself. This week we hope to provide you with the correct link.
The announcement about the London Perl Workshop might have also been a bit premature as it was still unclear if it will happen at all. I am still unclear about the exact situation, but this is an excellent opportunity for you to step up. Check out the web-site of LPW where you can find the names and the contact information of the organizers. Talk to them and offer your help. Any help. That will increase the chances for this to actually take place. We even received a special announcement exclusive to the readers of the Perl Weekly.
I figured I need to update my web site and emphasize that I help companies deal with legacy code, and that made me think: What does 'legacy code' mean? How is it different from 'existing code' or 'code in production'? Is it a term use in a derogative manner? Does it mean 'code that is in use, but where the authors have disappeared'? Does it mean 'code that I am scared to touch'? Maybe 'code that still makes money, but we are unsure how it works, we need to make changes but we are scared to do'?
I'd love to hear (well, read) what do you think about it. I know I could ask the AI overlord, but I am old-school and I prefer human intelligence.
While we are figuring out how to define legacy code I thought I'll organize an online event in which we'll take a CPAN module and add some tests to it. Register here
In any case, have a nice week!
--
Your editor: Gabor Szabo.
Announcements
Perl IDE survey
After a long hiatus the Perl IDE Survey is back to another round. It will take you about 20 seconds to fill it.
Articles
6 Perl One-Liners to Replace Common Linux Utilities
why for/foreach can't use existing vars?
A lesson in scoping?
OpenAPI Linter
OpenAPI has become the standard for designing, building and documenting RESTful APIs. However, ensuring your OpenAPI specifications are both syntactically correct and follow best practices can be challenging. OpenAPI::Linter brings comprehensive validation and linting capabilities directly into your Perl applications and development workflow, helping you catch issues before they impact your API consumers.
Increasing Code coverage with Gemini
Excellent, showing the prompts help a lot!
Enhance your Gemini code assistance with a PRD document
I made a multiple-insert as well as other methods for Mojo::Pg
ANNOUNCE: Perl.Wiki V 1.33 & Mojolicious.Wiki V 1.08
Ron moved to a retirement village and still coding at 75. Nice.
App::Test::Generator 0.12
App::Test::Generator - Generate fuzz and corpus-driven test harnesses. This module takes a formal input/output specification for a routine or method and automatically generates test cases.
The Weekly Challenge
The Weekly Challenge by Mohammad Sajid Anwar will help you step out of your comfort-zone. You can even win prize money of $50 by participating in the weekly challenge. We pick one champion at the end of the month from among all of the contributors during the month, thanks to the sponsor Lance Wicks.
The Weekly Challenge - 346
Welcome to a new week with a couple of fun tasks "Longest Parenthesis" and "Magic Expression". 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 - 345
Enjoy a quick recap of last week's contributions by Team PWC dealing with the "Peak Positions" and "Last Visitor" tasks in Perl and Raku. You will find plenty of solutions to keep you busy.
TWC345
Code that is clear, effective and useful and that accurately addresses both issues. The solutions demonstrate good Perl fundamentals with straightforward algorithmic approaches.
Last Peak
This is an excellent example of using Raku's special feature set to solve a problem in a stylish, understandable and effective manner. In addition to solving the problem, Arne uses it to illustrate why Raku is a delight for algorithmic and data-centric programming. It is a brilliant pedagogical move to go from a naive to an idiomatic solution.
I Went to the Mountains
Excellent practical Perl programming is demonstrated in this post, with an emphasis on readable, maintainable code that addresses the issue at hand directly. Bob takes a methodical, deliberate approach that is full of the kind of practical judgment that distinguishes good code from great code. The technical content is very interesting because of the conversational tone and cultural allusions.
Perl Weekly Challenge: Week 345
Excellent approach to problem-solving that combines efficient debugging and logical reasoning. By pointing out edge cases, clearing up early misunderstandings and offering comprehensive explanations, Jaldhar exhibits strong analytical abilities.
The Last Peak
This is a thorough, engineering-focused in-depth analysis that places a premium on robustness, accuracy and beautiful API design. It is not merely a solution post. Jorg approaches the challenges with the rigor of a software engineer building production-grade code, not just solving puzzles.
Perl Weekly Challenge 345
A sophisticated, functionally-focused Perl solution that showcases complex programming methods like closures, iterators and functional composition. He tackles the problems with a thorough knowledge of Perl's functional programming features.
Visiting the Peaks
Brilliantly idiomatic Perl that makes use of sophisticated language features to produce succinct, effective and ingenious solutions. Matthias exhibits a thorough comprehension of Perl's contemporary features and functional programming capabilities.
Teach Them How To Say PWCā¦
This is a philosophical and pedagogical analysis of the Perl Weekly Challenge itself rather than a solution post. The difficulties serve as a starting point for more in-depth conversations about community, learning and the nature of programming expertise.
Peak at the answers
A simple, effective and useful Perl implementation that uses little code to accurately address both issues. Without superfluous abstraction or flourish, Peter concentrates on the fundamental algorithmic requirements. It is an example of "get the job done" programming.
The Weekly Challenge #345
A comprehensive, expertly designed set of solutions with a focus on robustness, extensive testing and unambiguous documentation. Robbie shows how to develop software in a methodical, quality-focused manner.
Position the Visitor
A highly analytical and mathematically complex method that investigates the problems underlying structure. Beyond simple implementation, Roger explores mathematical properties, algorithmic complexity and sophisticated Raku idioms.
Peak Visitors
A simple, useful implementation that puts accuracy and readability ahead of cunning. Simon is refreshingly honest about their comprehension of the issues and exhibits a methodical approach to problem-solving.
Perl Weekly Challenge: 345
A clear, useful Perl implementation that uses simple, readable code to accurately address both issues. Vinod exhibits solid Perl foundations and a pragmatic approach to problem-solving.
Weekly collections
NICEPERL's lists
Great CPAN modules released last week.
Events
Perl Maven online: Adding tests to legacy Perl code
November 11, 2025
Paris.pm monthly meeting
November 12, 2025
London Perl and Raku Workshop
November 29, 2025
Toronto.pm - online - How SUSE is using Perl
December 6, 2025
Paris.pm monthly meeting
December 10, 2025
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.
According to the new source::encoding pragma's documentation,
use source::encoding 'ascii'is automatically enabled within the lexical scope of ause v5.41.0or higher.
To me, this means that
use v5.42;
is equivalent to
use v5.42;
use source::encoding "ascii";
But that doesn't seem to be the case.
$ perl -e'use v5.42; my $x = "Ć©";'
$ perl -e'use v5.42; use source::encoding "ascii"; my $x = "Ć©";'
Use of non-ASCII character 0xC3 illegal when 'use source::encoding "ascii"' is in effect at -e line 1, near ""ascii";"
Execution of -e aborted due to compilation errors.
Bug or misunderstanding?

One more contribution, OpenAPI::Linter to validate and lint OpenAPI Specification. For more information, please follow the link:
https://theweeklychallenge.org/blog/openapi-linter
On my last post I asked Gemini to create a product requirement document to outline a plan to improve the overall state of the ev-calc-pricing application. In this blog entry I will discuss my interaction with Gemini and how it increased code coverage of the ev-calc-pricing application. Below is an example of the prompts:
----
> review PRD.md for @ev-calc-pricing
āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā®
ā ā ReadFile PRD.md ā
ā°āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāÆ
⦠The PRD.md outlines a plan to refactor the ev-calc-pricing application to improve maintainability, data accuracy, and
robustness.
Key issues identified:
* Manual, hardcoded electricity rate data in StateRates.pm.
* Minimal test coverage.
* Unused scripts and lack of input validation.
The plan focuses on four epics:
1. Automated Data Pipeline: To fetch, process, and load electricity rate data automatically.
2. Comprehensive Test Suite: To ensure accuracy and stability of calculations and data loading.
3. Code Refactoring and Cleanup: To remove hardcoded data, unused scripts, and consolidate data files.
4. Enhanced User Experience: To add input validation and better user feedback.
The success metrics include reducing data update time, increasing code coverage to over 80%, and eliminating
calculation-related bugs.
> Lets focus on code coverage
⦠Okay, code coverage. The PRD says EVCalc.pm and StateRates.pm need unit tests. I'll start by reviewing the existing
tests in the t/ directory.
āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā®
ā ā ReadFolder t ā
ā ā
ā Listed 2 item(s). ā
ā°āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāÆ
⦠Okay, two test files: 001_base.t and 002_index_route.t. I'll read 001_base.t first to see what it covers.
āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā®
ā ā ReadFile t/001_base.t ā
ā°āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāÆ
⦠001_base.t just loads EVCalc. Now reading 002_index_route.t to check its web interface tests.
āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā®
ā ā ReadFile t/002_index_route.t ā
ā°āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāÆ
⦠002_index_route.t is a simple integration test for the main route. I'll now examine EVCalc.pm to understand the core
logic for testing.
āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā®
ā ā ReadFile lib/EVCalc.pm ā
ā°āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāÆ
⦠I've analyzed EVCalc.pm and found the calculation logic is embedded in the post '/' route. To properly test it, I'll
refactor the calculations into a new calculate_costs subroutine. My plan is to move the logic, create a new test file
t/003_calculation.t, and then write unit tests for various scenarios. I'm starting with the refactoring of EVCalc.pm
now.
-------------
And yes Gemini did refactor my code in order to create a test file and test the new function but unfortunately it didn't get it write in the first try.
Here is the refactored code with the test script
And now the correction on the test script .
line of code in the test script :
------------
is( $results{state_rates}->{'Alabama'}->{total_price}, '10.77', 'Correct total price for Alabama' );
------------
Essentially Gemini assumed that the states were abbreviated on StateRates.pm until it attempted a test run and learned that not only the state name was incorrect but also the calculated results. So you see AI just like humans have moments where it forgets what it wrote a few mins ago.
And now for the coverage report:
---------------------------------------
t/001_base.t ......... ok
t/002_index_route.t .. 1/2 [EVCalc:26770] core @2025-11-01 22:13:40> looking for get / in /Library/Perl/5.34/Dancer2/Core/App.pm l. 37
[EVCalc:26770] core @2025-11-01 22:13:40> Entering hook core.app.before_request in (eval 279)[/System/Library/Perl/Extras/5.34/Class/Method/Modifiers.pm:89] l. 1
[EVCalc:26770] core @2025-11-01 22:13:40> Entering hook core.app.after_request in (eval 279)[/System/Library/Perl/Extras/5.34/Class/Method/Modifiers.pm:89] l. 1
[EVCalc:26770] core @2025-11-01 22:13:40> running hook entry Dancer2::Core::App::__ANON__ in (eval 279)[/System/Library/Perl/Extras/5.34/Class/Method/Modifiers.pm:89] l. 1
t/002_index_route.t .. ok
t/003_calculation.t .. ok
All tests successful.
Files=3, Tests=6, 1 wallclock secs ( 0.01 usr 0.00 sys + 0.87 cusr 0.08 csys = 0.96 CPU)
Result: PASS
Reading database from /Users/itcharlie/Desktop/Projects/ev-calc-pricing/cover_db
---------------------- ------ ------ ------ ------ ------ ------
File stmt bran cond sub time total
---------------------- ------ ------ ------ ------ ------ ------
blib/lib/EVCalc.pm 100.0 n/a n/a 100.0 99.9 100.0
blib/lib/StateRates.pm 100.0 n/a n/a 100.0 0.0 100.0
Total 100.0 n/a n/a 100.0 100.0 100.0
---------------------- ------ ------ ------ ------ ------ ------
---------------------------------------
-
App::Music::ChordPro - A lyrics and chords formatting program
- Version: v6.090.0 on 2025-10-31, with 409 votes
- Previous CPAN version: v6.080.1 was 2 months, 2 days before
- Author: JV
-
App::Netdisco - An open source web-based network management tool.
- Version: 2.094002 on 2025-10-29, with 773 votes
- Previous CPAN version: 2.094001 was before
- Author: OLIVER
-
App::perlimports - Make implicit imports explicit
- Version: 0.000058 on 2025-10-28, with 20 votes
- Previous CPAN version: 0.000057 was 5 months, 28 days before
- Author: OALDERS
-
CPANSA::DB - the CPAN Security Advisory data as a Perl data structure, mostly for CPAN::Audit
- Version: 20251026.001 on 2025-10-26, with 25 votes
- Previous CPAN version: 20251020.002 was 5 days before
- Author: BRIANDFOY
-
DBIx::DataModel - UML-based Object-Relational Mapping (ORM) framework
- Version: 3.14 on 2025-10-28, with 13 votes
- Previous CPAN version: 3.13 was 2 days before
- Author: DAMI
-
HTTP::BrowserDetect - Determine Web browser, version, and platform from an HTTP user agent string
- Version: 3.45 on 2025-11-01, with 58 votes
- Previous CPAN version: 3.44
- Author: OALDERS
-
JSON::Schema::Modern - Validate data against a schema using a JSON Schema
- Version: 0.621 on 2025-10-30, with 12 votes
- Previous CPAN version: 0.620 was 14 days before
- Author: ETHER
-
Mojo::mysql - Mojolicious and Async MySQL/MariaDB
- Version: 1.28 on 2025-10-30, with 36 votes
- Previous CPAN version: 1.27 was 2 years, 3 days before
- Author: JHTHORSEN
-
Mouse - Moose minus the antlers
- Version: v2.6.0 on 2025-10-30, with 63 votes
- Previous CPAN version: v2.5.11 was 1 year, 2 months, 25 days before
- Author: SYOHEX
-
OrePAN2 - Yet another DarkPAN manager.
- Version: 0.53 on 2025-10-31, with 22 votes
- Previous CPAN version: 0.52 was 1 year, 8 months, 11 days before
- Author: OALDERS
-
Perlanet - command line interface to Perlanet.pm
- Version: v3.3.4 on 2025-10-29, with 25 votes
- Previous CPAN version: v3.3.3 was 5 months, 29 days before
- Author: DAVECROSS
-
PPI - Parse, Analyze and Manipulate Perl (without perl)
- Version: 1.284 on 2025-10-28, with 64 votes
- Previous CPAN version: 1.283 was 5 months, 24 days before
- Author: OALDERS
-
Time::Piece - Object Oriented time objects
- Version: 1.39 on 2025-10-25, with 64 votes
- Previous CPAN version: 1.38 was 6 days before
- Author: ESAYM
-
WebService::Fastly - an interface to most facets of the [Fastly API](https://www.fastly.com/documentation/reference/api/).
- Version: 13.00 on 2025-10-31, with 18 votes
- Previous CPAN version: 12.00 was 2 months, 2 days before
- Author: FASTLY
-
WWW::Mechanize::Chrome - automate the Chrome browser
- Version: 0.75 on 2025-10-31, with 22 votes
- Previous CPAN version: 0.74 was 25 days before
- Author: CORION
In my previous blogpost I briefly discussed the use of Gemini Cli on a Perl dancer application to analyze its codebase. The next step is to generate a product requirement document. Why is this important ? well I had a bad experience with Gemini on another application where I allowed it to roam free "YOLO" mode and it basically started fixing all the problem areas one after another for about an hour or so until my free trial of Google Gemini expired for the day. This resulted into a completely rewritten application that was not able to run due to so many different errors. The cool thing is that I had version control so a good old "git reset --hard Head" cleared up my project and I could start over again.
Ok so back to the product requirement document, this document basically outlines the steps needed to resolve all the recommendations made by Gemini Ai during its code analysis. This means that you now have a clear path for AI to follow and you can essentially continue where you left off just in case you run out of free AI tokens for the day. Also make sure that you have a project that is under version control so you can commit changes as they occur after testing. Here is an example of the PRD.md file from my github repository.
I found the two tasks this week straight-forward and oddly specific, respectively.
Music: the task titles this week are "Peak Positions" and "Last Visitor", which led me to the refrain "I went to the mountains." It's a reference to Closer to Fine by the Indigo Girls, which references Perl philosophy: "There's more than one answer to these questions pointing me in a crooked line, and the less I seek my source for some definitive, the closer I am to fine."
However, for "Peak Positions", let's go with Ain't No Mountain High Enough by Marvin Gaye; and for "Last Visitor", with it's odd back and forth, how about the venerable Hello, Goodbye by the Beatles.
Task 1: Peak Position
The task
You are given an array of integers, @ints. Find all the peaks in the array. A peak is an element that is strictly greater than its left and right neighbors. Return the indices of all such peak positions.
The thought process
My first thought was to use List::MoreUtils::indexes to test each element, but the edges make it weird. One way or another, they will have to be handled separately. Maybe put a fake element on each end? Do them first and then process the rest? Or test for edges while looping?
My mental model is that the edges of the list fall away into an abyss, so anything outside the list should be below the altitudes given at the edge positions. I suppose it's equally valid to assume that the list is surrounded by huge ice walls (winter is coming).
There are a couple of unspecified anomalies, for which I'm going to take executive decisions:
- Empty list: return an empty list
- Single element: that's one peak at index 0
- Ramp up: (e.g. 7,8,9) the rightmost element is the only peak
- Ramp down: (e.g. 6,5,4) the left-most element is the only peak
- Plateau: (e.g., 7,7,7) No peak, return an empty list. This contradicts my decision for a single element (a plateau of one). Do I contradict myself? Very well then, I contradict myself. (I am large, I contain multitudes.)
The code
sub peakPos(@int)
{
my @peak = ();
for my ($i, $n) ( indexed @int )
{
my $left = ( $i == 0 ) ? $n-1 : $int[$i-1];
my $right = ( $i == $#int ) ? $n-1 : $int[$i+1];
push @peak, $i if ( $n > $left && $n > $right );
}
return \@peak;
}
Notes:
- Once again I chose
indexed(anointed as non-experimental in Perl 5.40) for concise and efficient array traversal. - Each element has a left neighbor and a right neighbor. For the edges, I'm going to conjure up the missing neighbor and make it less, assuming that outside the list is a bottomless void. You know the one -- the one we scream into while we're on mute during Zoom calls.
Task 2: Last Visitor
The task
You are given an integer array @ints where each element is either a positive integer or -1. We process the array from left to right while maintaining two lists:
-
@seen: stores previously seen positive integers (newest at the front) -
@ans: stores the answers for each -1
Rules:
- If $ints[i] is a positive number -> insert it at the front of @seen
At the end, return @ans.
The thought process
This task description is highly proscriptive. I'm not sure there's anything better to do here than to translate the text into Perl statements.
sub lastVisitor(@int)
{
my @seen = ();
my @ans = ();
my $x = 0; # Count of consecutive -1s
for ( @int )
{
if ( $_ > 0 )
{
$x = 0;
unshift @seen, $_;
}
else
{
if ( $x < @seen )
{
push @ans, $seen[$x];
}
else
{
push @ans, -1;
}
$x++;
}
}
return \@ans;
}
Notes: I don't think there's much to add. There's a couple of basic language features being exploited.
-
for (@int)-- use the implicit$_variable for array elements to avoid having to think of a name -
unshift-- put things on the front of a list -
@seen-- in scalar context gives the size of the array (no need for alength())
The only thing tricky here is incrementing and resetting $x so that it correctly counts the consecutive occurrences of -1. Because there was a possibility of error, I of course made that error, but unit tests straightened me out.
Originally published at Perl Weekly 744
Hi there,
We are excited to announce that The Trampery, located on Old Street in London, will host the London Perl Workshop 2025 on November 29, 2025. Bring your thoughts, your code, your queries and your excitement to this next must-attend Perl community event. To help shape the day, the organisers are already taking suggestions from sponsors and the community. We would like to express our gratitude in advance to all of the sponsors who help make this event possible. Our community thrives because of your support; if you or your organisation are interested in sponsorship opportunities, please review the information on the website. This is your chance to interact, learn, share and develop whether you're an experienced Perl hacker, module author, maintainer or someone who is interested in the language's future developments.
The Perl core team released the development release Perl v5.43.4 concurrently with the announcement of the event. This version provides the most recent advancements in Perl's development and is a member of the blead (development) branch. Please find the changes in the perldelta page.
26th Oct marks the 30th anniversary of the Comprehensive Perl Archive Network (CPAN), which has been driving innovation, teamwork and the Perl ecosystem for 30 years. I can still clearly recall my initial feelings of excitement and apprehension when I uploaded a module to CPAN, knowing that it would be instantly mirrored globally. When CPAN was founded in 1995, it was truly revolutionary. Built before GitHub even existed, it gave Perl a superpower that no other language at the time possessed: a global, searchable, installable archive of reusable code. The people who created the archive as well as the archive itself are what most amaze me. CPAN has always been primarily a human network, with volunteers running PAUSE, tireless testers finding bugs before users ever notice them, authors who ship with care and toolsmiths who make installations run more smoothly each year. To celebrate the occassion, I uploaded v0.67 of BankAccount::Validator::UK.
Enjoy rest of the newsletter.
--
Your editor: Mohammad Sajid Anwar.
Announcements
Development release of Perl v5.43.4
This release focuses on Unicode handling improvements and internationalization support.
London Perl Workshop 2025
It's back again, please join us for an exciting informative one day event.
Dancer2 2.0.1 Released
Dancer2 2.0.1 has been released. It's a small maintenance release that fixes a few broken documentation links.
The Perl IDE - Developer Survey 2025 is now live!
After 12 year hiatus, the Perl IDE Developer Survey has returned! Please do take part in the survey.
Articles
Perl in Jupyter Notebook: A Modern Look for a Classic Language
The article is valuable and motivational, especially for people in the Perl community who feel Perl has had less representation in data science / notebooks / ML. It shows convincingly that the building blocks exist and invites people to experiment.
0xblog ā About āPerlā, in 2022
This article is inspiring and helpful, in my opinion. Anyone in the Perl community (or nearby) who wants to be reminded of Perl's modern capabilities and feel that it is still relevant should read it.
A palindromic polyglot program in x86 machine code, Perl, shell, and make
Binary Golf Grand Prix is an annual small file format competition, currently in it's sixth year. The goal is to make the smallest possible file that fits the criteria of the challenge.
Beware of Geeks bearing Grifts
Excellent technical writing - accessible deep knowledge, strong literary craft, authentic developer humor and clearly rooted in the Perl ecosystem.
CPAN
Test2::Plugin::SubtestFilter
Test2::Plugin::SubtestFilter released for Perl tests, which allows filtering test targets by subtest name, similar to --testNamePattern in jest and vitest.
The Weekly Challenge
The Weekly Challenge by Mohammad Sajid Anwar will help you step out of your comfort-zone. You can even win prize money of $50 by participating in the weekly challenge. We pick one champion at the end of the month from among all of the contributors during the month, thanks to the sponsor Lance Wicks.
The Weekly Challenge - 345
Welcome to a new week with a couple of fun tasks "Peak Positions" and "Last Visitor". 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 - 344
Enjoy a quick recap of last week's contributions by Team PWC dealing with the "Array Form Compute" and "Array Formation" tasks in Perl and Raku. You will find plenty of solutions to keep you busy.
TWC344
This blog post successfully guides the reader through the process of resolving two programming challenges and is technically sound and well-written. It exhibits sound coding techniques and strong problem-solving abilities. The main strength of the post is its easy-to-understand, step-by-step explanation style, which makes it suitable for programmers of all skill levels.
Form Formation
The post is well structured and easy to follow, introducing the challenge clearly and then solving it step by step. It uses clean, idiomatic Raku, showcasing native language strengths like permutations, MAIN signature validation and concise array/string transformations. The solutions are compact yet readable, demonstrating how expressive Raku can be for problems that would be verbose in other languages.
Pick Up the Pieces
The post provides a clear, correct and well-structured solution using backtracking. It balances readability with reasonable efficiency for small to medium-sized inputs.
Perl Weekly Challenge: Week 344
This is a brief and useful article that emphasizes offering practical solutions with little fanfare. The author demonstrates a get-it-done mentality by using a "one-liner" approach for the first problem and a simple brute-force permutation strategy for the second. The review will draw attention to some crucial scalability and robustness considerations, even though the solutions are functionally correct for the examples provided.
Turning Arrays Into Arrays
The blog post provides clear, concise and idiomatic Perl solutions to the week 344 tasks. The post provides multiple examples for each task, covering various scenarios and edge cases. This helps readers understand the problem's nuances and test their solutions effectively.
Lazyness and too much tasks!
The post is excellent as an educational and practical demonstration of Raku for these algorithmic challenges. It leverages Rakuās expressive features well amd for small to medium inputs, the solutions work effectively.
Perl Weekly Challenge 344
This is a sophisticated and well-engineered set of solutions that demonstrates deep expertise in Perl, particularly with the Perl Data Language (PDL). It provides multiple approaches for each task, showing a thorough understanding of different algorithmic strategies and their trade-offs. The code is professional, robust and well-documented.
Take it to the Limits
This is a superb example of production-quality thinking that goes far beyond typical challenge solutions. Matthias demonstrates exceptional foresight in identifying edge cases and designing scalable, robust algorithms.
A-ray Sunshine!
This technical blog post is incredibly well-written and captivating. It effectively achieves its main objective, which is to guide the reader through a challenging programming problem while elucidating the reasoning behind it, its dead ends and its elegant solution. In technical writing, it's the ideal illustration of "show your work".
Hip, hip, array!
In the great majority of real-world use cases, this solution accurately resolves the issue and is clear, practical and effective. It creates a sophisticated one-liner by utilizing Perl's advantages in handling strings and numbers. The fundamental requirement of the problemāconverting between array and numerical representationsāis clearly understood by Peter.
The Weekly Challenge #344
For the examples provided, Robbie offers two workable solutions that accurately address the challenge problems. The solutions are straightforward and practical, prioritizing clarity and simplicity over scalability or optimization for edge cases. The code has a clear structure and useful documentation.
All is Array Formation
This blog post goes beyond standard challenge solutions and is incredibly intelligent and sophisticated. In addition to solving the problems, Roger delves into complex computer science ideas and skillfully makes connections between the two seemingly unconnected tasks. The post exhibits expert-level understanding of functional programming paradigms, algorithms and programming language theory.
The one about arrays
This explanation of the Weekly Challenge solutions is clear, easy to understand and useful. Beginners and intermediate developers will find Simon's conversational, tutorial-like style especially approachable. The article emphasizes readability and direct problem-solving over algorithmic optimization, with a focus on concise, practical Perl solutions.
Perl Weekly Challenge: 344
These are clean, practical and clever solutions that demonstrate excellent Perl idioms and pragmatic problem-solving. Vinod favors simplicity and readability while leveraging Perl's unique strengths effectively.
Rakudo
2025.42 Release #186 (2025.10)
Weekly collections
NICEPERL's lists
Great CPAN modules released last week.
Events
Paris.pm monthly meeting
November 12, 2025
London Perl and Raku Workshop
November 29, 2025
Toronto.pm - online - How SUSE is using Perl
December 6, 2025
Paris.pm monthly meeting
December 10, 2025
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.
-
App::DBBrowser - Browse SQLite/MySQL/PostgreSQL databases and their tables interactively.
- Version: 2.436 on 2025-10-24, with 18 votes
- Previous CPAN version: 2.435 was 9 days before
- Author: KUERBIS
-
App::Netdisco - An open source web-based network management tool.
- Version: 2.093001 on 2025-10-24, with 767 votes
- Previous CPAN version: 2.093000 was before
- Author: OLIVER
-
Bitcoin::Crypto - Bitcoin cryptography in Perl
- Version: 3.002 on 2025-10-24, with 13 votes
- Previous CPAN version: 3.001 was 1 year, 29 days before
- Author: BRTASTIC
-
CPANSA::DB - the CPAN Security Advisory data as a Perl data structure, mostly for CPAN::Audit
- Version: 20251020.002 on 2025-10-20, with 25 votes
- Previous CPAN version: 20251019.001 was same day
- Author: BRIANDFOY
-
Dancer2 - Lightweight yet powerful web application framework
- Version: 2.0.1 on 2025-10-22, with 138 votes
- Previous CPAN version: 2.0.0 was 1 month, 7 days before
- Author: CROMEDOME
-
HTTP::Message - HTTP style message (base class)
- Version: 7.01 on 2025-10-19, with 71 votes
- Previous CPAN version: 7.00 was 1 year, 12 days before
- Author: OALDERS
-
IO::Compress - IO Interface to compressed data files/buffers
- Version: 2.214 on 2025-10-24, with 17 votes
- Previous CPAN version: 2.213 was 1 year, 1 month, 27 days before
- Author: PMQS
-
LWP - The World-Wide Web library for Perl
- Version: 6.81 on 2025-10-22, with 209 votes
- Previous CPAN version: 6.80 was 1 month, 10 days before
- Author: OALDERS
-
Module::CoreList - what modules shipped with versions of perl
- Version: 5.20251022 on 2025-10-23, with 44 votes
- Previous CPAN version: 5.20250923 was 1 month before
- Author: BINGOS
-
WWW::Mechanize - Handy web browsing in a Perl object
- Version: 2.20 on 2025-10-22, with 103 votes
- Previous CPAN version: 2.19 was 1 year, 1 month, 6 days before
- Author: OALDERS
We've seen cases where installing a perl module via cpanm fails silently to actually install the module. This is occurring on Debian 12.
For example:
cpanm --installdeps --notest Unicode::Lite
completes without error. But use of this module in a perl script fails due to it not being installed (in any of the standard system/library locations).
If we cd to the appropriate .cpanm directory and run
gmake
gmake install
the modules installs and is useable.
cpanm is executed as the root user. What are we missing?
-
App::DBBrowser - Browse SQLite/MySQL/PostgreSQL databases and their tables interactively.
- Version: 2.435 on 2025-10-14, with 18 votes
- Previous CPAN version: 2.434 was 9 days before
- Author: KUERBIS
-
App::rdapper - a command-line RDAP client.
- Version: 1.20 on 2025-10-14, with 21 votes
- Previous CPAN version: 1.19 was 1 month, 13 days before
- Author: GBROWN
-
CPANSA::DB - the CPAN Security Advisory data as a Perl data structure, mostly for CPAN::Audit
- Version: 20251018.003 on 2025-10-19, with 25 votes
- Previous CPAN version: 20251017.001 was 1 day before
- Author: BRIANDFOY
-
Cucumber::TagExpressions - A library for parsing and evaluating cucumber tag expressions (filters)
- Version: 8.0.0 on 2025-10-14, with 16 votes
- Previous CPAN version: 6.2.0 was 4 months, 20 days before
- Author: CUKEBOT
-
Data::ObjectDriver - Simple, transparent data interface, with caching
- Version: 0.26 on 2025-10-17, with 16 votes
- Previous CPAN version: 0.25 was 6 months, 1 day before
- Author: SIXAPART
-
Finance::Quote - Get stock and mutual fund quotes from various exchanges
- Version: 1.67 on 2025-10-18, with 143 votes
- Previous CPAN version: 1.66_02 was 1 month, 17 days before
- Author: BPSCHUCK
-
Google::Ads::GoogleAds::Client - Google Ads API Client Library for Perl
- Version: v29.0.1 on 2025-10-16, with 20 votes
- Previous CPAN version: v29.0.0 was 1 day before
- Author: CHEVALIER
-
JSON::Schema::Modern - Validate data against a schema using a JSON Schema
- Version: 0.620 on 2025-10-15, with 12 votes
- Previous CPAN version: 0.619 was 17 days before
- Author: ETHER
-
SPVM - The SPVM Language
- Version: 0.990105 on 2025-10-16, with 36 votes
- Previous CPAN version: 0.990104 was 1 day before
- Author: KIMOTO
-
Term::Choose - Choose items from a list interactively.
- Version: 1.777 on 2025-10-15, with 15 votes
- Previous CPAN version: 1.776 was 18 days before
- Author: KUERBIS
-
Time::Piece - Object Oriented time objects
- Version: 1.38 on 2025-10-18, with 64 votes
- Previous CPAN version: 1.3701 was 1 month, 23 days before
- Author: ESAYM
-
Type::Tiny - tiny, yet Moo(se)-compatible type constraint
- Version: 2.008004 on 2025-10-17, with 145 votes
- Previous CPAN version: 2.008003 was 1 month, 15 days before
- Author: TOBYINK
(A version of this article also appears as App::ClipboardUtils::Manual::HowTo::ClipaddCookbook on CPAN.)
Introduction
clipadd, a CLI included in the App::ClipboardUtils distribution, lets you add items to the desktop clipboard. It is clipboard-manager-agnostic, supporting backends like xclip and Klipper. It also has some convenient features which will be demonstrated in this document.
Adding multiple entries from a text file
% clipadd --split-by '\n---\n' < FILENAME
For example, after adding FAQ entries from this text file:
Question 1 Answer 1 --- Question 2 Answer 2 --- Question 3 Answer 3
then you can setup keyboard shortcuts like Ctrl-Alt-Up and Ctrl-Alt-Down in Klipper to quickly access those FAQ entries to provide quick answers in chats.
Adding ouput from command-line, one line at a time
% clipadd -c COMMAND % clipadd -c COMMAND -t ; # to see the output on stdout as well
This is convenient because it lets you feed input to a command interactively and immediately get the output as clipboard content.
For example, using with safer:
% clipadd -c safer -t Foo Bar, Inc. foo-bar-inc _
I can paste company names and get a slug name to use in file manager to create directory, etc.
Adding text fragments from a text file as clipboard contents
% clipadd --fragments < FILENAME
This is a variation of the previous recipe. Using fragments allows you to only add certain entries and in custom order. Example content of text file:
FAQS ==== Question 1 # BEGIN clipadd id=2 Answer 1 # END clipadd id=2 Question 2 # BEGIN clipadd id=1 Answer 2 # END clipadd id=1 Question 3 # BEGIN clipadd id=3 Answer 3 # END clipadd id=3 Question 4 Answer 4
See Also
clipadd (a.k.a. add-clipboard-content, a.k.a. ca).
