<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
<link href="https://perlmaven.com/atom" rel="self" />
<title>Perl</title>
<id>https://perlmaven.com</id>
<updated>2026-08-12T11:00:02</updated>

  <entry>
    <title>Punk: Perl MVC, compiled at boot</title>
    <summary type="html"><![CDATA[]]></summary>
    <updated>2026-08-12T11:00:02Z</updated>
    <pubDate>2026-08-12T11:00:02Z</pubDate>
    <link rel="alternate" type="text/html" href="https://perlmaven.com/punk-perl-mvc-compiled-at-boot" />
    <id>https://perlmaven.com/punk-perl-mvc-compiled-at-boot</id>
    <content type="html"><![CDATA[<h2 class="title is-4">Description:</h2>
<p>In this presentation we will dive into the <a href="https://punkperl.com">Punk</a> ecosystem: an open source MVC web framework with first class openAPI integration, template engine, job queue, json codec, non blocking data layer and http client all built on a highly optimised event-loop web server.</p>
<h2 class="title is-4">Bio:</h2>
<p><a href="https://www.linkedin.com/in/lnation--/">Robert Acock</a> (<a href="https://metacpan.org/author/LNATION">LNATION</a>) is a CPAN author with over 250 contributions. They run their own contracting company, LNATION LTD, which also recently launched <a href="https://openapi-proxy.com">OpenAPI Proxy</a>. They like to experiment with C/XS, writing Perl as fast as it can be.</p>
<p><a class="button is-primary" href="https://luma.com/o4k2uute">register</a></p>
]]></content>
    <author>
      <name></name>
    </author>
  </entry>

  <entry>
    <title>MCP - Model Context Protocol in Perl: From Web App to AI Tools with Dave Cross</title>
    <summary type="html"><![CDATA[]]></summary>
    <updated>2026-08-06T16:40:02Z</updated>
    <pubDate>2026-08-06T16:40:02Z</pubDate>
    <link rel="alternate" type="text/html" href="https://perlmaven.com/mcp-model-context-protocol-in-perl-from-web-app-to-ai-tools" />
    <id>https://perlmaven.com/mcp-model-context-protocol-in-perl-from-web-app-to-ai-tools</id>
    <content type="html"><![CDATA[<p>The Model Context Protocol (MCP) has rapidly become the standard way for AI assistants to interact with external applications. But how do you add MCP support to an application that already exists?</p>
<p>In this practical workshop we'll take a real Dancer2 application and add an MCP server that exposes its existing functionality to AI clients. Along the way we'll look at the MCP protocol, JSON-RPC, tool discovery, schema design and request handling, while keeping the implementation cleanly separated from the application's existing business logic.</p>
<p>We'll see how a YAML-driven design allows a single source of truth for tool definitions and documentation, and why adding MCP often turns out to be far less work than you'd expect when your application's architecture is already sound.</p>
<p>By the end of the session you'll understand the MCP protocol, know how to implement an MCP server in Perl, and have a design you can adapt to your own applications.</p>
<p>Speaker:</p>
<p>Dave Cross has been writing Perl professionally for more than thirty years. He is the author of several Perl books, including Data Munging with Perl (Manning) and Perl Template Toolkit (O'Reilly), and has been speaking at Perl conferences around the world since the late 1990s.</p>
<p>He builds web applications with Dancer2, contributes to open source, and has recently been exploring how established Perl applications can integrate with modern AI technologies such as the Model Context Protocol (MCP). His Line of Succession website now exposes its data through an MCP server, allowing AI assistants to query Britain's royal succession directly from the site's underlying database.</p>
<p>Dave believes the best way to learn a new technology is to build something real with it, and this workshop is based on exactly that experience.</p>
<p><a class="button is-primary" href="https://luma.com/6qqyscbm">register</a></p>
]]></content>
    <author>
      <name></name>
    </author>
  </entry>

  <entry>
    <title>Async, Type-Safe, and Secure: Perl&#39;s Answer to FastAPI</title>
    <summary type="html"><![CDATA[]]></summary>
    <updated>2026-08-06T16:00:02Z</updated>
    <pubDate>2026-08-06T16:00:02Z</pubDate>
    <link rel="alternate" type="text/html" href="https://perlmaven.com/async-type-safe-and-secure-perls-answer-to-fastapi" />
    <id>https://perlmaven.com/async-type-safe-and-secure-perls-answer-to-fastapi</id>
    <content type="html"><![CDATA[<h2 class="title is-4">Description</h2>
<p>This is a practical exploration of PAGI::FastAPI and its latest addition PAGI::FastAPI::Security that introduces you to modern asynchronous Perl web development if you have been using FastAPI in Python asking yourself why this can't be done in Perl. (Spoiler: it can now)</p>
<h2 class="title is-4">Bio</h2>
<p><a href="https://www.linkedin.com/in/mohammadanwar/">Mohammad Sajid Anwar</a> is a CPAN author and White Camel award recipient, recognised for his sustained contributions to the Perl community. He is the author of &quot;Design Patterns in Modern Perl&quot; and the creator of &quot;The Weekly Challenge&quot;, a long-running initiative since 2019. He is an editor of the Perl Weekly newsletter. He speaks regularly at Perl conferences and is an active mentor and contributor across the CPAN ecosystem.</p>
<p><a class="button is-primary" href="https://luma.com/obzvoiii">register</a></p>
]]></content>
    <author>
      <name></name>
    </author>
  </entry>

  <entry>
    <title>Perl development using Codex by Emmanuel Thouraud</title>
    <summary type="html"><![CDATA[]]></summary>
    <updated>2026-08-03T12:40:02Z</updated>
    <pubDate>2026-08-03T12:40:02Z</pubDate>
    <link rel="alternate" type="text/html" href="https://perlmaven.com/perl-development-using-codex-by-emmanuel" />
    <id>https://perlmaven.com/perl-development-using-codex-by-emmanuel</id>
    <content type="html"><![CDATA[<iframe width="560" height="315" src="https://www.youtube.com/embed/l4kBbjgZntU" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>
<p>This was an ad-hoc presentation and thus we did not have an abstract for it.</p>
<ul>
<li><a href="https://www.linkedin.com/in/emmanuel-thouraud/">Emmanuel Thouraud</a></li>
<li><a href="https://github.com/M-M-M-M/perl-agents-md/">AGENTS.md of Emmanuel</a></li>
</ul>
]]></content>
    <author>
      <name></name>
    </author>
  </entry>

  <entry>
    <title>Setup GitHub Actions with Dist::Zilla, how to advance PRs</title>
    <summary type="html"><![CDATA[]]></summary>
    <updated>2026-02-11T08:00:02Z</updated>
    <pubDate>2026-02-11T08:00:02Z</pubDate>
    <link rel="alternate" type="text/html" href="https://perlmaven.com/github-action-with-dist-zilla-video" />
    <id>https://perlmaven.com/github-action-with-dist-zilla-video</id>
    <content type="html"><![CDATA[<iframe width="560" height="315" src="https://www.youtube.com/embed/ciQw5DMvRm8" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>
<ul>
<li>
<p>00:00 Introduction</p>
</li>
<li>
<p>01:30 <a href="https://osdc.code-maven.com/perl">OSDC Perl</a>, mention last week</p>
</li>
<li>
<p>03:00 Nikolai Shaplov <a href="https://metacpan.org/author/NATARAJ">NATARAJ</a>, one of our guests author of <a href="https://metacpan.org/dist/Lingua-StarDict-Writer">Lingua-StarDict-Writer</a> on GitLab.</p>
</li>
<li>
<p>04:30 Nikolai explaining his goals about security <a href="https://github.com/radiator-software/p5-net-ssleay/pull/509">memory leak in Net::SSLeay</a></p>
</li>
<li>
<p>05:58 What we did earlier. (Low hanging fruits.)</p>
</li>
<li>
<p>07:00 Let's take a look at the <a href="https://github.com/radiator-software/p5-net-ssleay">repository of Net::SSLeay</a></p>
</li>
<li>
<p>08:00 Try understand what happens in the repository?</p>
</li>
<li>
<p>09:15 A bit of explanation about adopting a module. (co-maintainer, unauthorized uploads)</p>
</li>
<li>
<p>11:00 <a href="https://pause.perl.org/">PAUSE</a></p>
</li>
<li>
<p>15:30 Check the &quot;river&quot; status of the distribution. (reverse dependency)</p>
</li>
<li>
<p>17:20 You can CC-me in your correspondence.</p>
</li>
<li>
<p>18:45 Ask people to review your pull-requests.</p>
</li>
<li>
<p>21:30 Mention the issue with DBIx::Class and how to take over a module.</p>
</li>
<li>
<p>23:50 A bit about the OSDC Perl page.</p>
</li>
<li>
<p>24:55 <a href="https://cpandashboard.com/">CPAN Dashboard</a> and how to add yourself to it.</p>
</li>
<li>
<p>27:40 Show the issues I opened asking author if they are interested in setting up GitHub Actions.</p>
</li>
<li>
<p>29:25 Start working on <a href="https://metacpan.org/dist/Dancer-Template-Mason">Dancer-Template-Mason</a></p>
</li>
<li>
<p>30:00 clone it</p>
</li>
<li>
<p>31:15 perl-tester Docker image.</p>
</li>
<li>
<p>33:30 Installing the dependencies in the Docker container</p>
</li>
<li>
<p>34:40 Create the GitHub Workflow file. Add to git. Push it out to GitHub.</p>
</li>
<li>
<p>40:55 First failure in the CI which is unclear.</p>
</li>
<li>
<p>42:30 Verifying the problem locally.</p>
</li>
<li>
<p>43:10 Open an issue.</p>
</li>
<li>
<p>58:25 Can you talk about dzil and Dist::Zilla?</p>
</li>
<li>
<p>1:02:25 We get back to working in the CI.</p>
</li>
<li>
<p>1:03:25 Add <code>--notest</code> to make installations run faster.</p>
</li>
<li>
<p>1:05:30 Add the git configuration to the CI workflow.</p>
</li>
<li>
<p>1:06:32 Is it safe to use <code>--notest</code> when installing dependencies?</p>
</li>
<li>
<p>1:11:05 git rebase squashing the commits into one commit</p>
</li>
<li>
<p>1:13:35 <code>git push --force</code></p>
</li>
<li>
<p>1:14:10 Send the <a href="https://github.com/yanick/Dancer-Template-Mason/pull/8">pull-request</a>.</p>
</li>
</ul>
]]></content>
    <author>
      <name></name>
    </author>
  </entry>

  <entry>
    <title>Add META data, .gitignore and GitHub Actions to Common::CodingTools</title>
    <summary type="html"><![CDATA[]]></summary>
    <updated>2026-02-01T22:00:02Z</updated>
    <pubDate>2026-02-01T22:00:02Z</pubDate>
    <link rel="alternate" type="text/html" href="https://perlmaven.com/meta-data-and-github-actions-for-common-codingtools-video" />
    <id>https://perlmaven.com/meta-data-and-github-actions-for-common-codingtools-video</id>
    <content type="html"><![CDATA[<p><a href="https://osdc.code-maven.com/perl">OSDC Perl</a>.</p>
<iframe width="560" height="315" src="https://www.youtube.com/embed/fW3uCc-Vw-g" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>
<ul>
<li>00:00 Introduction to OSDC</li>
<li>01:30 Introducing myself <a href="https://perlmaven.com/">Perl Maven</a>, <a href="https://perlweekly.com/">Perl Weekly</a></li>
<li>02:10 The earlier issues.</li>
<li>03:10 How to select a project to contribute to?</li>
<li>04:50 Chat on <a href="https://osdc.zulipchat.com/">OSDC Zulip</a></li>
<li>06:45 How to select a Perl project?</li>
<li>09:20 <a href="https://cpan-digger.perlmaven.com/">CPAN::Digger</a></li>
<li>10:10 Modules that don't have a link to their VCS.</li>
<li>13:00 Missing CI - GitHub Actions or GitLab Pipeline and Travis-CI.</li>
<li>14:00 Look at Term-ANSIEncode by Richard Kelsch - How to find the repository of this project?</li>
<li>15:38 Switching top look at Common-CodingTools by mistake.</li>
<li>16:30 How MetaCPAN knows where is the repository?</li>
<li>17:52 Clone the repository.</li>
<li>18:15 Use the <a href="https://github.com/szabgab/perl-docker-on-ubuntu/">szabgab/perl</a> Docker container.</li>
<li>22:10 Run <code>perl Makefile.PL</code>, install dependency, run <code>make</code> and <code>make distdir</code>.</li>
<li>23:40 See the generated <code>META.json</code> file.</li>
<li>24:05 Edit the <code>Makefile.PL</code></li>
<li>24:55 Explaining my method of cloning first (calling it <code>origin</code>) and forking later and calling that <code>fork</code>.</li>
<li>27:00 Really edit <code>Makefile.PL</code> and add the <code>META_MERGE</code> section and verify the generated <code>META.json</code> file.</li>
<li>29:00 Create a branch locally. Commit the change.</li>
<li>30:10 Create a fork on GitHub.</li>
<li>31:45 Add the <code>fork</code> as a remote repository and push the branch to it.</li>
<li>33:20 Linking to the PR on the <a href="https://osdc.code-maven.com/perl">OSDC Perl report page</a>.</li>
<li>35:00 Planning to add <code>.gitignore</code> and maybe setting up GitHub Action.</li>
<li>36:00 Start from the <code>main</code> branch, create the <code>.gitignore</code> file.</li>
<li>39:00 Run the tests locally. Set up GitHub Actions to run the tests on every push.</li>
<li>44:00 Editing the GHA configuration file.</li>
<li>48:30 Commit, push to the fork, check the results of GitHub Action in my fork on GitHub.</li>
<li>51:45 Look at the version of the <a href="https://hub.docker.com/r/perldocker/perl-tester/">perldocker/perl-tester</a> Docker image.</li>
<li>54:40 Update list of Perl versions in the CI. See the results on GitHub.</li>
<li>55:30 Show the version number of perl.</li>
</ul>
]]></content>
    <author>
      <name></name>
    </author>
  </entry>

  <entry>
    <title>Perl-related GitHub organizations</title>
    <summary type="html"><![CDATA[A list of GitHub organization containing Perl projects]]></summary>
    <updated>2026-01-31T10:00:02Z</updated>
    <pubDate>2026-01-31T10:00:02Z</pubDate>
    <link rel="alternate" type="text/html" href="https://perlmaven.com/github-organizations" />
    <id>https://perlmaven.com/github-organizations</id>
    <content type="html"><![CDATA[<p>Most projects are started by a single person in a GitHub repository of that person. Later for various reasons people establish GitHub organizations
and move the projects there.
Sometimes the organization contains a set of sub-projects related to a central project. (e.g. A web framework and its extensions or database access.)
Sometimes it is a collection of projects related to a single topic. (e.g. testing or IDE support.)
Sometimes it is just a random collection of project where people band together in the hope that no project will be left behind. (e.g. the CPAN Authors organization.)</p>
<p>Organizations make it easier to have multiple maintainers and thus ensuring continuity of project, but it might also mean that none of the members really
feel the urge to continue working on something.</p>
<p>In any case, I tried to collect all the Perl-related GitHub organizations.</p>
<p>Hopefully in ABC order...</p>
<ul>
<li>
<p><a href="https://github.com/beyondgrep">Beyond grep</a> - It is mostly for <code>ack</code>, a <code>better grep</code> developed by Andy Lester. No public members. 4 repositories.</p>
</li>
<li>
<p><a href="https://github.com/perl-catalyst/">Catalyst</a> - Catalyst is a web-framework. Its runtime and various extensions are maintained in this organization. 10 members and 39 repositories.</p>
</li>
<li>
<p><a href="https://github.com/cpan-authors/">cpan-authors</a> - A place for CPAN authors to collaborate more easily. 4 members and 9 repositories.</p>
</li>
<li>
<p><a href="https://github.com/davorg-cpan">davorg cpan</a> - Organisation for maintaining Dave Cross's CPAN modules. No public members and 47 repositories.</p>
</li>
<li>
<p><a href="https://github.com/exiftool">ExifTool</a> - No public members. 3 repositories.</p>
</li>
<li>
<p><a href="https://github.com/foswiki">Foswiki</a> - The Foswiki and related projects. 13 members and 649 repositories.</p>
</li>
<li>
<p><a href="https://github.com/gitpan">gitpan</a> - An archive of CPAN modules - 2 members and 5k+ read-only repositories.</p>
</li>
<li>
<p><a href="https://github.com/Kelp-framework">Kelp framework</a> - a web development framework. 1 member and 12 repositories.</p>
</li>
<li>
<p><a href="https://github.com/Metacpan">MetaCPAN</a> - The source of the MetaCPAN site - 9 member and 56 rpositories.</p>
</li>
<li>
<p><a href="https://github.com/mojolicious">Mojolicious</a> - Some Perl and many JavaScript projects. 5 members and 29 repositories.</p>
</li>
<li>
<p><a href="https://github.com/moose/">Moose</a> - Moose,<code>MooseX-*</code>, Moo, etc. 11 members and 69 repositories.</p>
</li>
<li>
<p><a href="https://github.com/netdisco">Netdisco</a> - Netdisco and SNMP-Info projects. 10 members and 14 repositories.</p>
</li>
<li>
<p><a href="https://github.com/PadreIDE">PadreIDE</a> - Padre, the Perl IDE. 13 members and 102 repositories.</p>
</li>
<li>
<p><a href="https://github.com/paracamelus">Paracamelus</a> - No public members. 2 repositories.</p>
</li>
<li>
<p><a href="https://github.com/Perl/">Perl</a> - Perl 5 itself, Docker images, etc. 20 members, 8 repositories.</p>
</li>
<li>
<p><a href="https://github.com/perl-actions/">Perl Actions</a> - GitHub Actions to be used in workflows. 5 members and 9 repositories.</p>
</li>
<li>
<p><a href="https://github.com/perladvent/">Perl Advent Calendar</a> - including the source of <a href="https://perl.com/">perl.com</a>. 3 members and 8 repositories.</p>
</li>
<li>
<p><a href="https://github.com/Perl-Bitcoin">Perl Bitcoin</a> - Perl Bitcoin Toolchain Collective. 3 members and 7 repositories.</p>
</li>
<li>
<p><a href="https://github.com/Perl-Toolchain-Gang">Perl Toolchain Gang</a> - ExtUtils::MakeMaker, Module::Build, etc. 27 members and 41 repositories.</p>
</li>
<li>
<p><a href="https://github.com/PerlToolsTeam/">Perl Tools Team</a> - source of planetperl , perl-ads  etc. No public members. 6 repositories.</p>
</li>
<li>
<p><a href="https://github.com/PerlDancer/">Perl Dancer</a> - Dancer, Dancer2,  many plugins. 30 members and 79 repositories.</p>
</li>
<li>
<p><a href="https://github.com/perltidy">perltidy</a> - Only for Perl::Tidy. No public members. 1 repository.</p>
</li>
<li>
<p><a href="https://github.com/perl5-dbi/">perl5-dbi</a> - DBI, several <code>DBD::*</code> modules, and some related modules. 7 members and 15 repositories.</p>
</li>
<li>
<p><a href="https://github.com/perlorg/">perl.org</a> - also cpan.org and perldoc.perl.org. 3 members and 7 repositories.</p>
</li>
<li>
<p><a href="https://github.com/Perl5">Perl5</a> - DBIx-Class and DBIx-Class-Historic. No public members. 2 repositories.</p>
</li>
<li>
<p><a href="https://github.com/perl5-utils/">perl5-utils</a> - List::MoreUtils, File::ShareDir etc. 2 members and 22 repositories.</p>
</li>
<li>
<p><a href="https://github.com/Perl-Critic">Perl-Critic</a> - PPI, Perl::Critic and related. 7 members and 5 repositories.</p>
</li>
<li>
<p><a href="https://github.com/perl-ide">perl-ide</a> - Perl Development Environments. 26 members and 13 repositories.</p>
</li>
<li>
<p><a href="https://github.com/perl-pod">perl-pod</a> - Pod::Simple, Test::Pod. 1 member and 4 repositories.</p>
</li>
<li>
<p><a href="https://github.com/PerlPkgConfig">PkgConfig</a> - 1 member 1 repository.</p>
</li>
<li>
<p><a href="https://github.com/plack/">plack</a> - psgi-specs, Plack and a few middlewares. 5 members and 7 repositories.</p>
</li>
<li>
<p><a href="https://github.com/RexOps">RexOps</a> - Rex, Rexify and related projects. 1 member and 46 repositories.</p>
</li>
<li>
<p><a href="https://github.com/sqitchers/">Sqitch </a> - Sqitch for Sensible database change management and related projects. No public members. 16 repositories.</p>
</li>
<li>
<p><a href="https://github.com/StrawberryPerl/">StrawberryPerl</a> - The Perl distribution for MS Windows. 4 members and 10 repositories.</p>
</li>
<li>
<p><a href="https://github.com/Test-More">Test-More</a> - Test::Builder, Test::Simple, Test2 etc. - 4 members, 27 repositories.</p>
</li>
<li>
<p><a href="https://github.com/EnlightenedPerlOrganisation">The Enlightened Perl Organisation</a> - Task::Kensho and <code>Task::Kensho::*</code>. 1 member and 1 repository.</p>
</li>
<li>
<p><a href="https://github.com/Thunderhorse-Framework">Thunderhorse Framework</a> - a modern web development framework. No public members. 4 repositories.</p>
</li>
<li>
<p><a href="https://github.com/webmin">Webmin</a> - Webmin is a web-based system administration tool for Unix-like servers. - 5 repositories.</p>
</li>
</ul>
<h2 class="title is-4">Companies</h2>
<p>These are bot Perl-specific GitHub organizations, but some of the repositories are in Perl.</p>
<ul>
<li>
<p><a href="https://github.com/cpanel">cPanel</a> - Open Source Software provided by cPanel. 1 member and 22 repositories.</p>
</li>
<li>
<p><a href="https://github.com/orgs/duckduckgo/">DuckDuckGo</a> - The search engine. 19 members and 122 repositories.</p>
</li>
<li>
<p><a href="https://github.com/fastmail">Fastmail</a> - Open-source software developed at Fastmail. 4 members and 38 repositories.</p>
</li>
<li>
<p><a href="https://github.com/RotherOSS">RotherOSS</a> - Otobo (OTRS fork). No public members. 47 repositories.</p>
</li>
</ul>
]]></content>
    <author>
      <name></name>
    </author>
  </entry>

  <entry>
    <title>Lock and unlock hash using Hash::Util</title>
    <summary type="html"><![CDATA[lock_hash and unlock_hash to avoid accidental changes]]></summary>
    <updated>2026-01-28T18:00:02Z</updated>
    <pubDate>2026-01-28T18:00:02Z</pubDate>
    <link rel="alternate" type="text/html" href="https://perlmaven.com/lock-and-unlock-hash" />
    <id>https://perlmaven.com/lock-and-unlock-hash</id>
    <content type="html"><![CDATA[<p>If you don't like the <a href="/autovivification">autovivification</a> or simply would like to make sure the code does not accidentally alter a
hash the <a href="https://metacpan.org/pod/Hash::Util">Hash::Util</a> module is for you.</p>
<p>You can <code>lock_hash</code> and later you can <code>unlock_hash</code> if you'd like to make some changes to it.</p>
<p>In this example you can see 3 different actions commented out.
Each one would raise an exception if someone tries to call them on a locked hash.
After we unlock the hash we can execute those actions again.</p>
<p>I tried this both in perl 5.40 and 5.42.</p>
<p><strong><a href="https://github.com/szabgab/perlmaven.com/tree/main/examples/locking_hash.pl">examples/locking_hash.pl</a></strong></p>
<pre><code class="language-perl">use strict;
use warnings;
use feature 'say';

use Hash::Util qw(lock_hash unlock_hash);
use Data::Dumper qw(Dumper);


my %person = (
    fname =&gt; &quot;Foo&quot;,
    lname =&gt; &quot;Bar&quot;,
);
lock_hash(%person);

print Dumper \%person;
print &quot;$person{fname} $person{lname}\n&quot;;
say &quot;fname exists &quot;, exists $person{fname};
say &quot;language exists &quot;, exists $person{language};

# $person{fname} = &quot;Peti&quot;;     # Modification of a read-only value attempted
# delete $person{lname};       # Attempt to delete readonly key 'lname' from a restricted hash
# $person{language} = &quot;Perl&quot;;  # Attempt to access disallowed key 'language' in a restricted hash

unlock_hash(%person);

$person{fname} = &quot;Peti&quot;;     # Modification of a read-only value attempted
delete $person{lname};       # Attempt to delete readonly key 'lname' from a restricted hash
$person{language} = &quot;Perl&quot;;  # Attempt to access disallowed key 'language' in a restricted hash

print Dumper \%person;

</code></pre>
<pre><code class="language-perl">$VAR1 = {
          'lname' =&gt; 'Bar',
          'fname' =&gt; 'Foo'
        };
Foo Bar
fname exists 1
language exists
$VAR1 = {
          'language' =&gt; 'Perl',
          'fname' =&gt; 'Peti'
        };
</code></pre>
]]></content>
    <author>
      <name></name>
    </author>
  </entry>

  <entry>
    <title>Open Source contribution - Perl - Tree-STR, JSON-Lines, and Protocol-Sys-Virt - Setup GitHub Actions</title>
    <summary type="html"><![CDATA[]]></summary>
    <updated>2026-01-25T11:00:02Z</updated>
    <pubDate>2026-01-25T11:00:02Z</pubDate>
    <link rel="alternate" type="text/html" href="https://perlmaven.com/meta-data-and-github-actions-video" />
    <id>https://perlmaven.com/meta-data-and-github-actions-video</id>
    <content type="html"><![CDATA[<p>See <a href="https://osdc.code-maven.com/perl">OSDC Perl</a></p>
<iframe width="560" height="315" src="https://www.youtube.com/embed/Y1La0sfcvbI" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>
<ul>
<li>
<p>00:00 Working with Peter Nilsson</p>
</li>
<li>
<p>00:01 Find a module to add GitHub Action to. go to <a href="https://cpan-digger.perlmaven.com/recent">CPAN::Digger recent</a></p>
</li>
<li>
<p>00:10 Found <a href="https://metacpan.org/dist/Tree-STR">Tree-STR</a></p>
</li>
<li>
<p>01:20 Bug in CPAN Digger that shows a GitHub link even if it is broken.</p>
</li>
<li>
<p>01:30 Search for the module name on GitHub.</p>
</li>
<li>
<p>02:25 Verify that the name of the module author is the owner of the GitHub repository.</p>
</li>
<li>
<p>03:25 Edit the Makefile.PL.</p>
</li>
<li>
<p>04:05 Edit the file, fork the repository.</p>
</li>
<li>
<p>05:40 Send the Pull-Request.</p>
</li>
<li>
<p>06:30 Back to CPAN Digger recent to find a module without GitHub Actions.</p>
</li>
<li>
<p>07:20 Add file / Fork repository gives us &quot;unexpected error&quot;.</p>
</li>
<li>
<p>07:45 Direct fork works.</p>
</li>
<li>
<p>08:00 Create the <code>.github/workflows/ci.yml</code> file.</p>
</li>
<li>
<p>09:00 Example <a href="https://perlmaven.com/setup-github-actions">CI yaml file</a> copy it and edit it.</p>
</li>
<li>
<p>14:25 Look at a GitLab CI file for a few seconds.</p>
</li>
<li>
<p>14:58 Commit - change the branch and add a description!</p>
</li>
<li>
<p>17:31 Check if the GitHub Action works properly.</p>
</li>
<li>
<p>18:17 There is a warning while the tests are running.</p>
</li>
<li>
<p>21:20 Opening an <a href="https://github.com/ehuelsmann/perl-protocol-sys-virt/issues/1">issue</a>.</p>
</li>
<li>
<p>21:48 Opening the PR (on the wrong repository).</p>
</li>
<li>
<p>22:30 Linking to output of a CI?</p>
</li>
<li>
<p>23:40 Looking at the file to see the source of the warning.</p>
</li>
<li>
<p>25:25 Assigning an issue? In an open source project?</p>
</li>
<li>
<p>27:15 Edit the already created issue.</p>
</li>
<li>
<p>28:30 USe the Preview!</p>
</li>
<li>
<p>29:20 Sending the <a href="https://github.com/ehuelsmann/perl-protocol-sys-virt/pull/2">Pull-Request</a> to the project owner.</p>
</li>
<li>
<p>31:25 Switching to Jonathan</p>
</li>
<li>
<p>33:10 CPAN Digger recent</p>
</li>
<li>
<p>34:00 Net-SSH-Perl of BDFOY - Testing a networking module is hard and Jonathan is using Windows.</p>
</li>
<li>
<p>35:13 Frequency of update of CPAN Digger.</p>
</li>
<li>
<p>36:00 Looking at our notes to find the GitHub account of the module author LNATION.</p>
</li>
<li>
<p>38:10 Look at the modules of <a href="https://metacpan.org/author/LNATION">LNATION on MetaCPAN</a></p>
</li>
<li>
<p>38:47 Found <a href="https://metacpan.org/pod/JSON::Lines">JSON::Lines</a></p>
</li>
<li>
<p>39:42 Install the dependencies, run the tests, generate test coverage.</p>
</li>
<li>
<p>40:32 Cygwin?</p>
</li>
<li>
<p>42:45 Add Github Action copying it from the previous PR.</p>
</li>
<li>
<p>43:54 <code>META.yml</code> should not be committed as it is a generated file.</p>
</li>
<li>
<p>48:25 I am looking for sponsors!</p>
</li>
<li>
<p>48:50 Create a branch that reflects what we do.</p>
</li>
<li>
<p>51:38 commit the changes</p>
</li>
<li>
<p>53:10 Fork the project on GitHub and setup git remote locally.</p>
</li>
<li>
<p>55:05 <code>git push -u fork add-ci</code></p>
</li>
<li>
<p>57:44 Sending the Pull-Request.</p>
</li>
<li>
<p>59:10 The 7 dwarfs and Snowwhite. My hope is to have a 100 people sending these PRs.</p>
</li>
<li>
<p>1:01:30 Feedback.</p>
</li>
<li>
<p>1:02:10 Did you think this was useful?</p>
</li>
<li>
<p>1:02:55 Would you be willing to tell people you know that you did this and you will do it again?</p>
</li>
<li>
<p>1:03:17 You can put this on your resume. It means you know how to do it.</p>
</li>
<li>
<p>1:04:16 ... and Zoom suddenly closed the recording...</p>
</li>
</ul>
]]></content>
    <author>
      <name></name>
    </author>
  </entry>

  <entry>
    <title>Open source contribution - Perl - MIME::Lite - GitHub Actions, test coverage and adding a test</title>
    <summary type="html"><![CDATA[]]></summary>
    <updated>2026-01-25T09:00:02Z</updated>
    <pubDate>2026-01-25T09:00:02Z</pubDate>
    <link rel="alternate" type="text/html" href="https://perlmaven.com/testing-mime-lite-video" />
    <id>https://perlmaven.com/testing-mime-lite-video</id>
    <content type="html"><![CDATA[<p>See <a href="https://osdc.code-maven.com/perl">OSDC Perl</a></p>
<iframe width="560" height="315" src="https://www.youtube.com/embed/XuwHFAyldsA" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>
<ul>
<li>00:00 Introduction and about <a href="https://osdc.code-maven.com/perl">OSDC Perl</a></li>
<li>01:50 <a href="https://metacpan.org/about/sponsors">Sponsors of MetaCPAN</a>, looking at some modules on CPAN.</li>
<li>03:30 The river status</li>
<li>04:10 Picking <a href="https://metacpan.org/dist/MIME-Lite">MIME::Lite</a> and looking at MetaCPAN. Uses RT, has no GitHub Actions.</li>
<li>05:55 Look at the clone of the repository, the 2 remotes and the 3 branches.</li>
<li>06:40 GitHub Actions <a href="https://perlmaven.com/setup-github-actions">Examples</a></li>
<li>08:00 Running the Docker container locally. Install the dependencies.</li>
<li>09:10 Run the tests locally.</li>
<li>09:20 Add the <code>.gitignore</code> file.</li>
<li>10:30 Picking a module from <a href="https://metacpan.org/recent">MetaCPAN recent</a></li>
<li>11:10 <a href="https://cpan-digger.perlmaven.com/recent">CPAN Digger recent</a></li>
<li>12:20 Explaining about pair-programming and workshop.</li>
<li>13:25 CPAN Digger statistics</li>
<li>14:15 Generate test coverage report using <a href="https://metacpan.org/pod/Devel::Cover">Devel::Cover</a>.</li>
<li>17:15 The <code>fold</code> function that is not tested and not even used.</li>
<li>18:39 Wanted to open an issue about <code>fold</code>, but I'll probbaly don't do it on RT.</li>
<li>20:00 Updating the OSDC Perl document with the TODO items.</li>
<li>21:13 Split the packages into files?</li>
<li>22:27 The culture of Open Source contributions.</li>
<li>24:20 Why is the BEGIN line red when the content of the block is green?</li>
<li>27:40 Switching to the <code>long-header</code> branch.</li>
<li>30:40 Finding <code>header_as_string</code> in the documentation.</li>
<li>32:15 Going over the test with the long subject line.</li>
<li>33:54 Let's compare the result to an empty string.</li>
<li>36:15 Switching to <a href="https://metacpan.org/pod/Test::LongString">Test::Longstring</a> to see the difference.</li>
<li>37:35 <a href="https://metacpan.org/pod/Test::Differences">Test::Differences</a> was also suggested.</li>
<li>39:40 Push out the branch and send the Pull-request.</li>
<li>40:35 Did this really increase the test coverage? Let's see it.</li>
<li>43:50 Messing up the explanation about codition coverage.</li>
<li>45:35 The repeated use of the magic number 72.</li>
<li>47:00 Is the output actually correct? Is it according to the standard?</li>
<li>51:45 Discussion about /usr/bin/perl on the first line.</li>
<li>52:45 No version is specified.</li>
<li>55:15 The sentence should be &quot;conforms to the standard&quot;</li>
</ul>
]]></content>
    <author>
      <name></name>
    </author>
  </entry>

</feed>

