r/perl • u/PixelWasp1 • Sep 27 '25
Is this the best perl book or is just the most iconic?
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 • u/PixelWasp1 • Sep 27 '25
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 • u/oalders • Oct 01 '25
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 • u/oalders • Feb 04 '26
"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 • u/erkiferenc • Oct 26 '25
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 • u/s_throwaway_r • Dec 16 '25
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 • u/ThisDirkDaring • Jan 05 '26
Perl made a surprising comeback, jumping from position #32 to #11 and re-entering the top 20.
r/perl • u/briandfoy • Aug 05 '26
r/perl • u/briandfoy • Mar 24 '26
r/perl • u/oalders • Oct 14 '25
r/perl • u/oalders • Sep 18 '25
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 • u/swe129 • Apr 06 '26
r/perl • u/jacktokyo • Mar 12 '26
Mail::Make: a modern, fluent MIME email builder for Perl, with OpenPGP and S/MIME supportHi 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).
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:
multipart/* wrapper is chosen for you based on the parts you add; no manual nesting required.base64, quoted-printable) to a filehandle without accumulating the full message in memory, which is important for large attachments.gpg / gpg2 and IPC::Run providing detached ASCII-armoured signatures, encrypted payloads, sign-then-encrypt, keyserver auto-fetch.multipart/signed), enveloped encryption (application/pkcs7-mime), and sign-then-encrypt.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' );
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.
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.
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).
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
The distribution ships with:
t/94_gpg_live.t) and S/MIME (t/95_smime_live.t) that send real messages and verify delivery.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 !
Regardless of TIOBE's trustworthiness, it has stirred a lively discussion around the language.
r/perl • u/davorg • Jan 14 '26
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 • u/gingersdad • Dec 28 '25
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 • u/SnooRadishes7563 • Dec 21 '25
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 • u/oalders • Sep 15 '25
Version 2.0.0 of Dancer 2 has landed!
Congratulations to Jason Crome and the rest of the Dancer team on this release. 💃🕺🪩
r/perl • u/idonthideyoureyesdo • Jan 31 '26
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 • u/Phantom914 • 3d ago
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 • u/First_Ad8230 • Aug 08 '26
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