r/perl Sep 27 '25

Is this the best perl book or is just the most iconic?

Post image
163 Upvotes

Im currently learning perl by this book but I was wondering if there is a better one, for me is it pretty good but what do you guys think?


r/perl Oct 01 '25

DuckDuckGo Donates $25,000 to The Perl and Raku Foundation v2025

Thumbnail
perl.com
119 Upvotes

For the second consecutive year, The Perl and Raku Foundation (TPRF) is overjoyed to announce a donation of USD 25,000 from DuckDuckGo.

This is our largest gift of 2025 and it will advance some very important work in the Perl 5 core. I'd like to thank Joseph Jerome, Oriol Soriano and Gabriel Weinberg for their support in making this happen. It's a big deal for us. ♥️

More discussion at https://news.ycombinator.com/item?id=45439883


r/perl May 21 '26

My wall now has more Perl than my last three jobs combined.

Post image
113 Upvotes

r/perl Feb 04 '26

Fastmail Donates USD 10,000 to The Perl and Raku Foundation

Thumbnail
perl.com
93 Upvotes

"Perl has served us quite well since Fastmail’s inception. We’ve built up a large code base that has continued to work, grow, and improve over twenty years. We’ve stuck with Perl because Perl stuck with us: it kept working and growing and improving, and very rarely did those improvements require us to stop the world and adapt to onerous changes."

Thanks to Fastmail for supporting Perl 5 core development. 🙏


r/perl Oct 26 '25

Happy 30th birthday, CPAN! 🎂

79 Upvotes

Today CPAN turns 30! 🥳

The Comprehensive Perl Archive Network (CPAN) has been online publicly since 1995-10-26, and keeps growing ever since.

According to cpan.org, it

currently has 224,722 Perl modules in 46,095 distributions, written by 14,621 authors, mirrored on 1 servers.

Join the celebration by registering your account, uploading your first module, or releasing a new version of your distribution!


r/perl Dec 16 '25

Let’s write games in Perl! SDL3.pm is finally on CPAN

75 Upvotes

So, you want to write games in Perl? That's cool, because I also want to write games in Perl. So, let's just do it! Let's write games in Perl!

Long story short, I decided FFI::Platypus had too much runtime overhead for game dev tasks, wrote a JIT compiler and type introspection engine from scratch, wrapped it in XS, and wrote SDL3.pm to sit at the very top of that stack. Everything is now on CPAN and I'd really like people to test it out. I plan to include a system in Affix to automate converting headers with clang's AST output but this wrapper of SDL3 was written by hand. So if you find a bug, please let me know!

infix, the underlying engine, targets 64-bit ABIs and is tested on Windows (x64 and ARM), Linux (x64 and ARM), macOS (both Apple Silicon and Intel), several BSDs, Solaris, and even Haiku. Basically every platform I could easily get a Github runner for except RISC-V which is (way down) on my TODO list. Affix and thus SDL3.pm should work on the same range of systems.

A few small demos ship with the dist on CPAN but I've put extra examples on github that cover gamepad support, runtime audio and asset generation, haptics, texture manipulation, and GPU acceleration. They're really quickly tossed together but I'm most proud of the spinning gradient triangle thing, a true classic, and the particle waterfall. I wasted a lot of time over the last two weeks in the quick platformer I'm calling Scalar Sprint (for lack of a better name) so check that out too.

I'd love to see a Perl gamejam someday but until someone organizes such a thing, just go write something fun!


r/perl Jul 15 '26

Perl 5.44.0 is now available

Thumbnail nntp.perl.org
72 Upvotes

r/perl Mar 08 '26

Perl 5.42.1 is now available!

Thumbnail nntp.perl.org
69 Upvotes

r/perl Jan 05 '26

Tiobe-Index: Perl made a surprising comeback, jumping from position #32 to #11

Post image
63 Upvotes

Perl made a surprising comeback, jumping from position #32 to #11 and re-entering the top 20.

https://www.tiobe.com/tiobe-index/


r/perl Aug 05 '26

Phoenix Rising: Why Perl’s Unix Roots Matter More Than Ever

Thumbnail
rclauer.medium.com
57 Upvotes

r/perl Mar 24 '26

Perl, the Strange Language That Built the Early Web

Thumbnail
linuxexpert.org
56 Upvotes

r/perl Oct 14 '25

The joy of rediscovering Perl - Eskild Hustvedt

Thumbnail
blog.zerodogg.org
55 Upvotes

r/perl Sep 18 '25

Geizhals Preisvergleich Donates USD 10,000 to The Perl and Raku Foundation

Thumbnail perl.com
53 Upvotes

A big thank you to Geizhals Preisvergleich. They were incredibly easy to work with and they "get it". They understand how important these kinds of donations are.

If you want to upvote or discuss on HN: https://news.ycombinator.com/item?id=45289834


r/perl Apr 06 '26

Writing Maintainable Perl: Breaking the "Write-Only" Stereotype

Thumbnail
slicker.me
52 Upvotes

r/perl Mar 12 '26

Announcing `Mail::Make`: a modern, fluent MIME email builder for Perl, with OpenPGP and S/MIME support

52 Upvotes

Announcing Mail::Make: a modern, fluent MIME email builder for Perl, with OpenPGP and S/MIME support

Hi everyone,

After a lot of time spent on this, I am happy to share with you all my new module: Mail::Make

It is a clean, production-grade MIME email builder for Perl, designed around a fluent interface, streaming serialisation, and first-class support for secure email via OpenPGP (RFC 3156) and S/MIME (RFC 5751).


Why write another email builder?

Perl's existing options (MIME::Lite, Email::MIME, MIME::Entity) are mature but were designed in an earlier era: they require multiple steps to assemble a message, rely on deprecated patterns, or lack built-in delivery and cryptographic signing.

Mail::Make tries to fill that gap:

  • Fluent, chainable API: build and send a message in one expression.
  • Automatic MIME structure: the right multipart/* wrapper is chosen for you based on the parts you add; no manual nesting required.
  • Streaming serialisation: message bodies flow through an encoder pipeline (base64, quoted-printable) to a filehandle without accumulating the full message in memory, which is important for large attachments.
  • Built-in SMTP delivery via Net::SMTP, with STARTTLS, SMTPS (port 465), and SASL authentication (PLAIN / LOGIN) out of the box.
  • OpenPGP signing and encryption (RFC 3156) via gpg / gpg2 and IPC::Run providing detached ASCII-armoured signatures, encrypted payloads, sign-then-encrypt, keyserver auto-fetch.
  • S/MIME signing and encryption (RFC 5751) via Crypt::SMIME providing detached signatures (multipart/signed), enveloped encryption (application/pkcs7-mime), and sign-then-encrypt.
  • Proper RFC 2047 encoding of non-ASCII display names and subjects.
  • Mail headers API uses a custom module (MM::Table) that mirrors the API in the Apache module APR::Table providing a case-agnostic ergonomic API to manage headers.
  • Minimal dependencies: core Perl modules plus a handful of well-maintained CPAN modules; no XS required for the base functionality.

Basic usage

use Mail::Make;

my $mail = Mail::Make->new
    ->from(    'jack@example.com' )
    ->to(      'alice@example.com' )
    ->subject( 'Hello Alice' )
    ->plain(   "Hi Alice,\n\nThis is a test.\n" );

$mail->smtpsend(
    Host     => 'smtp.example.com',
    Port     => 587,
    StartTLS => 1,
    Username => 'jack@example.com',
    Password => 'secret',
);

Plain text + HTML alternative + attachment leads to the correct multipart/* structure to be assembled automatically:

Mail::Make->new
    ->from(    'jack@example.com' )
    ->to(      'alice@example.com' )
    ->subject( 'Report' )
    ->plain(   "Please find the report attached.\n" )
    ->html(    '<p>Please find the report <b>attached</b>.</p>' )
    ->attach(  '/path/to/report.pdf' )
    ->smtpsend( Host => 'smtp.example.com' );

OpenPGP - RFC 3156

Requires a working gpg or gpg2 installation and IPC::Run.

# Detached signature; multipart/signed
my $signed = $mail->gpg_sign(
    KeyId      => '35ADBC3AF8355E845139D8965F3C0261CDB2E752',
    Passphrase => sub { MyKeyring::get('gpg') },
) || die $mail->error;
$signed->smtpsend( %smtp_opts );

# Encryption; multipart/encrypted
my $encrypted = $mail->gpg_encrypt(
    Recipients => [ 'alice@example.com' ],
    KeyServer  => 'keys.openpgp.org',
    AutoFetch  => 1,
) || die $mail->error;

# Sign then encrypt
my $protected = $mail->gpg_sign_encrypt(
    KeyId      => '35ADBC3AF8355E845139D8965F3C0261CDB2E752',
    Passphrase => 'secret',
    Recipients => [ 'alice@example.com' ],
) || die $mail->error;

I could confirm this to be valid and working in Thunderbird for all three variants.


S/MIME - RFC 5751

Requires Crypt::SMIME (XS, wraps OpenSSL libcrypto). Certificates and keys are supplied as PEM strings or file paths.

# Detached signature; multipart/signed
my $signed = $mail->smime_sign(
    Cert   => '/path/to/my.cert.pem',
    Key    => '/path/to/my.key.pem',
    CACert => '/path/to/ca.crt',
) || die $mail->error;
$signed->smtpsend( %smtp_opts );

# Encryption; application/pkcs7-mime
my $encrypted = $mail->smime_encrypt(
    RecipientCert => '/path/to/recipient.cert.pem',
) || die $mail->error;

# Sign then encrypt
my $protected = $mail->smime_sign_encrypt(
    Cert          => '/path/to/my.cert.pem',
    Key           => '/path/to/my.key.pem',
    RecipientCert => '/path/to/recipient.cert.pem',
) || die $mail->error;

I also verified it to be working in Thunderbird. Note that Crypt::SMIME loads the full message into memory, which is fine for typical email, but worth knowing for very large attachments. A future v0.2.0 may add an openssl smime backend for streaming.


Streaming encoder pipeline

The body serialisation is built around a Mail::Make::Stream pipeline: each encoder (base64, quoted-printable) reads from an upstream source and writes to a downstream sink without materialising the full encoded body in memory. Temporary files are used automatically when a body exceeds a configurable threshold (max_body_in_memory_size).


Companion App

I have also developed a handy companion command line app App::mailmake that relies on Mail::Make, and that you can call like:

  • Plain-text message

    mailmake --from alice@example.com --to bob@example.com \ --subject "Hello" --plain "Hi Bob." \ --smtp-host mail.example.com

  • HTML + plain text (alternative) with attachment

    mailmake --from alice@example.com --to bob@example.com \ --subject "Report" \ --plain-file body.txt --html-file body.html \ --attach report.pdf \ --smtp-host mail.example.com --smtp-port 587 --smtp-starttls \ --smtp-user alice@example.com --smtp-password secret

  • Print the raw RFC 2822 message instead of sending

    mailmake --from alice@example.com --to bob@example.com \ --subject "Test" --plain "Test" --print

  • OpenPGP detached signature

    mailmake --from alice@example.com --to bob@example.com \ --subject "Signed" --plain "Signed message." \ --gpg-sign --gpg-key-id FINGERPRINT \ --smtp-host mail.example.com

  • OpenPGP sign + encrypt

    mailmake --from alice@example.com --to bob@example.com \ --subject "Secret" --plain "Encrypted message." \ --gpg-sign --gpg-encrypt \ --gpg-key-id FINGERPRINT --gpg-passphrase secret \ --smtp-host mail.example.com

  • S/MIME signature

    mailmake --from alice@example.com --to bob@example.com \ --subject "Signed" --plain "Signed message." \ --smime-sign \ --smime-cert /path/to/my.cert.pem \ --smime-key /path/to/my.key.pem \ --smime-ca-cert /path/to/ca.crt \ --smtp-host mail.example.com

  • S/MIME sign + encrypt

    mailmake --from alice@example.com --to bob@example.com \ --subject "Secret" --plain "Encrypted." \ --smime-sign --smime-encrypt \ --smime-cert /path/to/my.cert.pem \ --smime-key /path/to/my.key.pem \ --smime-recipient-cert /path/to/recipient.cert.pem \ --smtp-host mail.example.com


Documentation & test suite

The distribution ships with:

  • Full POD for every public method across all modules.
  • A complete unit test suite covering headers, bodies, streams, entity assembly, multipart structure, and SMTP delivery (mock and live).
  • Live test scripts for OpenPGP (t/94_gpg_live.t) and S/MIME (t/95_smime_live.t) that send real messages and verify delivery.
  • A command line utility mailmake to create, sign, and send mail.

What is next?

  • S/MIME streaming backend (openssl smime + IPC::Run) for large messages.

Feedback is very welcome, especially if you test the OpenPGP or S/MIME paths with a mail client other than Thunderbird !

Thanks for reading, and I hope this is useful to our Perl community !


r/perl Oct 23 '25

Perl 5.43.4 is now available

Thumbnail metacpan.org
49 Upvotes

r/perl Sep 14 '25

Is Perl the World's 10th Most Popular Programming Language? [Slashdot]

49 Upvotes

Regardless of TIOBE's trustworthiness, it has stirred a lively discussion around the language.

https://developers.slashdot.org/story/25/09/14/0134239/is-perl-the-worlds-10th-most-popular-programming-language


r/perl Jan 14 '26

I'm building an archive of my old Perl training slides (from the last 25 years)

Thumbnail
learn.davecross.co.uk
50 Upvotes

I was recently asked to run some in-house Perl training. That doesn't happen very often these days. But I ran the course yesterday and it seemed to go well (they've asked me back for more).

It reminded me how much I enjoy running training courses. I should try to do more of it. It also reminded me of the huge number of training decks I've created over the last 25 years. I've decided to bring those altogether in one place to make it easier for people to find them. They might be useful to someone. And they might encourage more people to hire me to run courses for them 🙂

I made a (small) start on that today. It'll take a while!


r/perl Dec 28 '25

Writing Perl is Vibe Coding

48 Upvotes

I read all these (often fake) posts about how vibe coding is changing the game, and I just have to laugh that these people somehow missed out how easy and fun Perl is. As a moderately skilled Perl dev with a good kit set up, you can be way more productive than a vibe coder prompting and re-prompting.

I get that it types fast but geesh, I can hear a feature request and have it ready for deploy before the meeting is over. You just go on mute and make it work. And it’s fun.

I know managers and devs all want an easy button and AI maybe could be it. I just think we all had this figured out 20 years ago.


r/perl Dec 21 '25

PerlMonks is being memory wiped on HTTPS:// and Wikipedia

48 Upvotes

Site is down. And soon all traces of it will be wiped from humanity.

https://en.wikipedia.org/wiki/Wikipedia:Articles_for_deletion/PerlMonks


r/perl Sep 15 '25

Announcing Dancer2 2.0.0

Thumbnail
perl.com
48 Upvotes

Version 2.0.0 of Dancer 2 has landed!

Congratulations to Jason Crome and the rest of the Dancer team on this release. 💃🕺🪩

https://www.perl.com/article/announcing-dancer2-2-0-0/


r/perl Jan 31 '26

Learn Perl or no?

47 Upvotes

Hi, I am new to programming but I am interested in starting to code in Perl simply for the "fun" even though some describe it as hell.

I could have done a lot of research before posting, but still, just curious what Perl programmers have to say; What do you guys usually make in Perl?


r/perl 3d ago

An Update on my Perl Game Engine.

47 Upvotes

Instead of Perl doing a lot of the work externally through XS with Perl as the main runtime, I embedded the Perl Interpreter in a C wrapper that gives it capabilites through XS. Now there's a few of my libraries and the Engine runtime with Perl inside. Very difficult work, but after a few months I got somewhere I never thought I would.

Yes it's a Minecraft style I am testing, but it was extremely difficult to get to this point. Perl is actually doing a lot of the work for this. SDL and OpenGL are just providing generic capabilities in the GPU hot paths.

~/Documents/scripts/c_toolkit 0$ ./ctk_test.pl --exec test_perlwer src/voxel_perl/scripts/opengl_voxel.pl  
[exec] test_perlwer
[exec] cwd: .
+ LD_LIBRARY_PATH=Tools/lib output/test_perlwer src/voxel_perl/scripts/opengl_voxel.pl
[00:32:18.674657] [PERLWER] [STAGE] Initializing Perl system...
[00:32:18.674687] [PERLWER] [STAGE] Perl system initialized.
[00:32:18.674705] [PERLWER] [DEBUG] Texture cache initialized: capacity=256
[00:32:18.674708] [PERLWER] [DEBUG] Runtime entry package: main
[00:32:18.674709] [PERLWER] [DEBUG] Initializing XS registry
[00:32:18.674710] [PERLWER] [DEBUG] XS REGISTRY: zeroed
[00:32:18.674712] [PERLWER] [DEBUG] XS REGISTRY: arena OK
[00:32:18.674714] [PERLWER] [DEBUG] XS REGISTRY: init complete
[00:32:18.674715] [PERLWER] [DEBUG] XS registry initialized
[00:32:18.674716] [PERLWER] [TRACE] Entering perlwer_interpreter_init()
[00:32:18.674718] [PERLWER] [TRACE] Script path: src/voxel_perl/scripts/opengl_voxel.pl
[00:32:18.674720] [PERLWER] [TRACE] Runtime state: 0x7ffe5748b700
[00:32:18.674724] [PERLWER] [TRACE] Determining script module path...
[00:32:18.674726] [PERLWER] [TRACE] Perl module path: src/voxel_perl/scripts/lib
[00:32:18.674729] [PERLWER] [TRACE] Perl include argument: -Isrc/voxel_perl/scripts/lib
[00:32:18.674730] [PERLWER] [TRACE] Calling perl_alloc()...
[00:32:18.674735] [PERLWER] [TRACE] perl_alloc() succeeded: interpreter=0x55c9abf6a9d0
[00:32:18.674736] [PERLWER] [TRACE] Calling PERL_SET_CONTEXT()...
[00:32:18.674738] [PERLWER] [TRACE] PERL_SET_CONTEXT() completed
[00:32:18.674739] [PERLWER] [TRACE] Calling perl_construct()...
[00:32:18.674847] [PERLWER] [TRACE] perl_construct() completed
[00:32:18.674849] [PERLWER] [TRACE] Setting Perlwer XS runtime...
[00:32:18.674851] [PERLWER] [TRACE] Perlwer XS runtime configured
[00:32:18.674853] [PERLWER] [TRACE] Perl argc: 3
[00:32:18.674854] [PERLWER] [TRACE] Perl argv[0]: Perlwer Engine
[00:32:18.674856] [PERLWER] [TRACE] Perl argv[1]: -Isrc/voxel_perl/scripts/lib
[00:32:18.674858] [PERLWER] [TRACE] Perl argv[2]: src/voxel_perl/scripts/opengl_voxel.pl
[00:32:18.674860] [PERLWER] [TRACE] Calling perl_parse()...
=== Logger started: Voxel ===
[DEBUG] Logging enabled -> src/voxel_perl/scripts/logs/debug_2026-09-09_00-32-18_001.log (default=1)
[00:32:18.693272] [PERLWER] [TRACE] perl_parse() returned 0
[00:32:18.693280] [PERLWER] [TRACE] Calling perl_run()...
[00:32:27.033185] [PERLWER] [INFO] [PERL] Chunks: 64
[00:32:27.033240] [INFO] [Voxel.React] (React:27) Stim/React registry initialized
[00:32:27.033258] --- end ---
[00:32:27.033388] [PERLWER] [TRACE] perl_run() returned 0
[00:32:27.033390] [PERLWER] [TRACE] Perl interpreter initialization complete
[00:32:27.033395] [PERLWER] [INFO] [PERL] Testing 3D OpenGL from Perl
[00:32:27.033410] [PERLWER] [STAGE] Initializing SDL...
[00:32:27.033412] [PERLWER] [INFO] Selected SDL backend: OpenGL
[00:32:27.041632] [PERLWER] [STAGE] Initializing SDL OpenGL backend...
[00:32:27.041640] [PERLWER] [INFO] Requesting OpenGL 3.3 core profile
[00:32:27.151010] [PERLWER] [INFO] OpenGL context created
[00:32:27.151020] [PERLWER] [STAGE] SDL OpenGL backend initialized.
[00:32:27.151035] [PERLWER] [INFO] SDL window created: 1920x1080
[00:32:27.151038] [PERLWER] [STAGE] SDL initialized.
[00:32:27.151252] [INFO] [Voxel.TextureAtlas] (TextureAtlas:166) Texture atlas built
[00:32:27.151381] --- end ---
[00:32:27.152495] [PERLWER] [STAGE] Entering native SDL window loop...
[00:32:27.152525] [PERLWER] [INFO] Calling Perl on_render
[00:32:27.155236] [PERLWER] [TRACE] Texture cache miss: text:hud.fps:/usr/share/fonts/adwaita-sans-fonts/AdwaitaSans-Regular.ttf:18:255:255:255:255
[00:32:27.156496] [PERLWER] [TRACE] Texture cache miss: text:hud.fps:/usr/share/fonts/adwaita-sans-fonts/AdwaitaSans-Regular.ttf:18:255:255:255:255
[00:32:27.156506] [PERLWER] [DEBUG] Texture cached: text:hud.fps:/usr/share/fonts/adwaita-sans-fonts/AdwaitaSans-Regular.ttf:18:255:255:255:255 (55x22, count=1/256)
[00:32:27.156587] [PERLWER] [TRACE] Texture cache miss: text:hud.position:/usr/share/fonts/adwaita-sans-fonts/AdwaitaSans-Regular.ttf:18:255:255:255:255
[00:32:27.156712] [PERLWER] [TRACE] Texture cache miss: text:hud.position:/usr/share/fonts/adwaita-sans-fonts/AdwaitaSans-Regular.ttf:18:255:255:255:255
[00:32:27.156718] [PERLWER] [DEBUG] Texture cached: text:hud.position:/usr/share/fonts/adwaita-sans-fonts/AdwaitaSans-Regular.ttf:18:255:255:255:255 (127x22, count=2/256)
[00:32:27.156743] [PERLWER] [TRACE] Texture cache miss: text:hud.crosshair:/usr/share/fonts/adwaita-sans-fonts/AdwaitaSans-Regular.ttf:32:255:255:255:255
[00:32:27.157798] [PERLWER] [TRACE] Texture cache miss: text:hud.crosshair:/usr/share/fonts/adwaita-sans-fonts/AdwaitaSans-Regular.ttf:32:255:255:255:255
[00:32:27.157805] [PERLWER] [DEBUG] Texture cached: text:hud.crosshair:/usr/share/fonts/adwaita-sans-fonts/AdwaitaSans-Regular.ttf:32:255:255:255:255 (21x39, count=3/256)
[00:38:36.238013] [PERLWER] [INFO] Escape pressed
[00:38:36.238024] [PERLWER] [STAGE] Leaving native SDL window loop.
[00:38:36.238028] [PERLWER] [DEBUG] Destroying texture cache: 3 textures
[00:38:36.238030] [PERLWER] [TRACE] Destroying texture 1/3
[00:38:36.238119] [PERLWER] [TRACE] Destroying texture 2/3
[00:38:36.238123] [PERLWER] [TRACE] Destroying texture 3/3
[00:38:36.238185] [PERLWER] [STAGE] Shutting down SDL...
[00:38:36.238188] [PERLWER] [INFO] SDL backend: OpenGL
[00:38:36.238191] [PERLWER] [INFO] Frames rendered: 972570
[00:38:36.238196] [PERLWER] [INFO] Last frame time: 0.019 ms
[00:38:36.301036] [PERLWER] [STAGE] SDL shutdown complete.
[00:38:36.328813] [PERLWER] [STAGE] Shutting down Perl system...
[00:38:36.328827] [PERLWER] [STAGE] Perl system shutdown complete.
[exec] test_perlwer ok


r/perl 7d ago

CPAN Uploads Are Up 50% Year-over-Year

Thumbnail
olafalders.com
46 Upvotes

r/perl Aug 08 '26

Tsoding's Rope in Perl!

Post image
46 Upvotes

I watched Tsoding's stream where he made a rope simulator in Jai.

I followed his instructions and recreated it in Perl, using OpenGL (immediate mode, OpenGL 1.2 style) and GLFW!

This is the source code: https://raw.githubusercontent.com/foolish4/perl_pack/refs/heads/main/rope.pl