<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Rob Lauer</title>
    <description>The latest articles on DEV Community by Rob Lauer (@rob_lauer_d8a575ed546516e).</description>
    <link>https://dev.to/rob_lauer_d8a575ed546516e</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F2884705%2F317944e6-58a2-47a4-a370-eaa99ea38d5e.jpg</url>
      <title>DEV Community: Rob Lauer</title>
      <link>https://dev.to/rob_lauer_d8a575ed546516e</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/rob_lauer_d8a575ed546516e"/>
    <language>en</language>
    <item>
      <title>Python 3.15 (Or, How Python is Slowly Becoming Perl)</title>
      <dc:creator>Rob Lauer</dc:creator>
      <pubDate>Fri, 24 Jul 2026 15:13:47 +0000</pubDate>
      <link>https://dev.to/rob_lauer_d8a575ed546516e/python-315-or-how-python-is-slowly-becoming-perl-bp8</link>
      <guid>https://dev.to/rob_lauer_d8a575ed546516e/python-315-or-how-python-is-slowly-becoming-perl-bp8</guid>
      <description>&lt;p&gt;Here we go again. The tech sphere is buzzing, Medium articles are&lt;br&gt;&lt;br&gt;
dropping, and the Python community is collectively celebrating&lt;br&gt;&lt;br&gt;
the "revolutionary" features coming in Python 3.15.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              &lt;/p&gt;

&lt;p&gt;I read through the latest feature announcements, and as someone who&lt;br&gt;&lt;br&gt;
has spent over four decades in IT, 3 of them writing Perl code, I&lt;br&gt;&lt;br&gt;
couldn't help but smile. For years I have felt like Python is&lt;br&gt;&lt;br&gt;
essentially just Perl for folks who found Perl "too indecipherable".&lt;br&gt;&lt;br&gt;
But Python it seems to me has become a Frankenstein monster born out&lt;br&gt;&lt;br&gt;
of someone's irrational fear of curly braces and &lt;strong&gt;sigils&lt;/strong&gt; (that's &lt;code&gt;@$%&lt;/code&gt;&lt;br&gt;&lt;br&gt;
for you Pythonistas).                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            &lt;/p&gt;

&lt;p&gt;And looking at the Python 3.15 changelog, it is clearer than ever:&lt;br&gt;&lt;br&gt;
Python is not really innovating, it's just improving itself by borrowing&lt;br&gt;&lt;br&gt;
concepts that Perl has embraced like...forever.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  &lt;/p&gt;

&lt;p&gt;Let’s take a look at the "groundbreaking" features in Python 3.15.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               &lt;/p&gt;

&lt;h3&gt;
  
  
  1. The "Lazy Import" Revolution
&lt;/h3&gt;

&lt;p&gt;Python 3.15 introduces &lt;code&gt;lazy import&lt;/code&gt; syntax to speed up initialization&lt;br&gt;&lt;br&gt;
times. The idea is simple: don't load a heavy module until the exact&lt;br&gt;&lt;br&gt;
moment you actually need to execute it - because you might not need to.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          &lt;/p&gt;

&lt;p&gt;Revolutionary, right? Except Perl developers have had &lt;code&gt;require&lt;/code&gt; and&lt;br&gt;&lt;br&gt;
&lt;code&gt;autouse&lt;/code&gt; for decades. Perl solved dynamic, on-demand loading back&lt;br&gt;&lt;br&gt;
when developers realized milliseconds (and size) matter when running web&lt;br&gt;&lt;br&gt;
applications.  No special syntax proxy; Perl just trusts the&lt;br&gt;&lt;br&gt;
programmer to know when to pull things into memory (and complains&lt;br&gt;&lt;br&gt;
loudly if they forget).                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          &lt;/p&gt;

&lt;h3&gt;
  
  
  2. Flattening Nested Data
&lt;/h3&gt;

&lt;p&gt;Python is now touting the ability to use &lt;code&gt;*group&lt;/code&gt; unpacking inside&lt;br&gt;&lt;br&gt;
list comprehensions so that developers can finally flatten nested&lt;br&gt;&lt;br&gt;
lists without writing confusing, double &lt;code&gt;for&lt;/code&gt;-loop syntax.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       &lt;/p&gt;

&lt;p&gt;Meanwhile, in Perl: &lt;code&gt;@flat = (@list1, @{$list2}, %list3)&lt;/code&gt;.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       &lt;/p&gt;

&lt;p&gt;Lists just flatten. By default. Perl doesn't make you go through hoops&lt;br&gt;&lt;br&gt;
(or loops) or wait for a major version bump to accomplish something as&lt;br&gt;&lt;br&gt;
mathematically fundamental as combining arrays. And for more exciting&lt;br&gt;&lt;br&gt;
ways of manipulating arrays see &lt;code&gt;List::Util&lt;/code&gt;!                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;As much as I hate to see Perl bolt on too much syntactic sugar, some&lt;br&gt;&lt;br&gt;
of the features of &lt;code&gt;List::Util&lt;/code&gt; should have been part of the&lt;br&gt;&lt;br&gt;
language. The compromise was adding &lt;code&gt;List::Util&lt;/code&gt; to core in Perl&lt;br&gt;&lt;br&gt;
5.7.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           &lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  3. Immutability
&lt;/h3&gt;

&lt;p&gt;Python 3.15 is finally adding &lt;code&gt;frozendict&lt;/code&gt; as a built-in type to give&lt;br&gt;&lt;br&gt;
developers a truly immutable dictionary. I'm sorry, but &lt;code&gt;frozendict&lt;/code&gt;?&lt;br&gt;&lt;br&gt;
Is that supposed to be some kind of locker room humor? I can't wait&lt;br&gt;&lt;br&gt;
for Python 3.16 to introduce &lt;code&gt;limpdict&lt;/code&gt; and of course the corrupted&lt;br&gt;&lt;br&gt;
hash - &lt;code&gt;soredict&lt;/code&gt;.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               &lt;/p&gt;

&lt;p&gt;Immutability is a good idea, especially for configurations. But&lt;br&gt;&lt;br&gt;
watching Python incrementally bolt on data-locking mechanisms rings a&lt;br&gt;&lt;br&gt;
bell. I think I've heard this one before. &lt;code&gt;constant&lt;/code&gt;?, &lt;code&gt;Readonly&lt;/code&gt;?,&lt;br&gt;&lt;br&gt;
&lt;code&gt;Hash::Util::lock_keys&lt;/code&gt;? Buehler? Anyone?                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        &lt;/p&gt;

&lt;h3&gt;
  
  
  4. Help! I Have a Syntax Error!
&lt;/h3&gt;

&lt;p&gt;When a developer accidentally tries to use JavaScript syntax in Python&lt;br&gt;&lt;br&gt;
(like &lt;code&gt;.push()&lt;/code&gt; instead of &lt;code&gt;.append()&lt;/code&gt;), Python 3.15 will now catch&lt;br&gt;&lt;br&gt;
the error and politely suggest the correct method. I think this says&lt;br&gt;&lt;br&gt;
something about the average Python developer by the way if they really&lt;br&gt;&lt;br&gt;
need this feature. I suppose (hope) it's aimed at Python newbies. But&lt;br&gt;&lt;br&gt;
it is also a very polite, modern echo of Perl's &lt;code&gt;use diagnostics;&lt;/code&gt;&lt;br&gt;&lt;br&gt;
(which almost no Perl programmer today would leave in production code&lt;br&gt;&lt;br&gt;
and probably doesn't even need while developing new code!).                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      &lt;/p&gt;

&lt;h3&gt;
  
  
  The Final Assessment
&lt;/h3&gt;

&lt;p&gt;Python is fine (I guess). It has clearly won the popularity contest in&lt;br&gt;&lt;br&gt;
the data science and ML spaces (and yes I'm jealous). These 3.15&lt;br&gt;&lt;br&gt;
updates - including a new Tachyon sampling profiler (see&lt;br&gt;&lt;br&gt;
&lt;code&gt;Devel::NYTProf&lt;/code&gt;) and a much stronger JIT compiler - are genuinely good&lt;br&gt;&lt;br&gt;
improvements.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    &lt;/p&gt;

&lt;p&gt;But let's be honest, stripped of the marketing hype, Python is on a&lt;br&gt;&lt;br&gt;
trajectory as predictable as Halley's Comet. It morphed from a&lt;br&gt;&lt;br&gt;
minimalist, heavily opinionated scripting language with OWTDI (one way&lt;br&gt;&lt;br&gt;
to do it) into a language that is now appeasing developers looking for&lt;br&gt;&lt;br&gt;
TIMTOWDI (there's more than one way to do it)!                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   &lt;/p&gt;

&lt;p&gt;Python is begrudgingly bolting on the things I've always appreciated&lt;br&gt;&lt;br&gt;
about Perl. It's actually annoying to watch, especially since these&lt;br&gt;&lt;br&gt;
are the exact same features Python developers originally claimed to&lt;br&gt;&lt;br&gt;
hate about Perl.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 &lt;/p&gt;

&lt;h3&gt;
  
  
  Feature Comparison: Python 3.15 vs Perl
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Python 3.15&lt;/th&gt;
&lt;th&gt;Perl 5.10 / Ecosystem&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Lazy Loading / Delayed Imports&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Introduces &lt;code&gt;lazy import&lt;/code&gt; syntax to defer module loading.&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;require&lt;/code&gt; and &lt;code&gt;autouse&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Flattening Nested Data&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Allows &lt;code&gt;*group&lt;/code&gt; unpacking directly inside list comprehensions.&lt;/td&gt;
&lt;td&gt;Native list context and array flattening (&lt;code&gt;@flat = (@a, @b)&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Immutable Dictionaries&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Adds &lt;code&gt;frozendict&lt;/code&gt; as a built-in, read-only dictionary type.&lt;/td&gt;
&lt;td&gt;The &lt;code&gt;constant&lt;/code&gt; pragma, &lt;code&gt;Hash::Util::lock_keys&lt;/code&gt;, and the &lt;code&gt;Readonly&lt;/code&gt; module&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Helpful Error Messages&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Provides contextual typo suggestions, like replacing &lt;code&gt;.push()&lt;/code&gt; with &lt;code&gt;.append()&lt;/code&gt;.&lt;/td&gt;
&lt;td&gt;The &lt;code&gt;use diagnostics;&lt;/code&gt; core pragma&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Zero-Overhead Profiling&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Introduces the Tachyon Sampling Profiler for running processes.&lt;/td&gt;
&lt;td&gt;The &lt;code&gt;Devel::NYTProf&lt;/code&gt; CPAN module&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Python is finally catching up. Maybe in another 76 years, they'll&lt;br&gt;&lt;br&gt;
discover the power of &lt;code&gt;@_&lt;/code&gt;.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      &lt;/p&gt;

</description>
      <category>perl</category>
      <category>python</category>
      <category>softwareengineering</category>
      <category>softwaredevelopment</category>
    </item>
    <item>
      <title>Release Notes in 3 minutes vs 30 using AI - More Makefile Magic</title>
      <dc:creator>Rob Lauer</dc:creator>
      <pubDate>Tue, 17 Mar 2026 16:51:48 +0000</pubDate>
      <link>https://dev.to/rob_lauer_d8a575ed546516e/release-notes-in-3-minutes-vs-30-using-ai-more-makefile-magic-14ja</link>
      <guid>https://dev.to/rob_lauer_d8a575ed546516e/release-notes-in-3-minutes-vs-30-using-ai-more-makefile-magic-14ja</guid>
      <description>&lt;h2&gt;
  
  
  Use a make target to help AI generate detailed and accurate release notes.
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://blog.tbcdevelopmentgroup.com/2026-03-17-post.html" rel="noopener noreferrer"&gt;https://blog.tbcdevelopmentgroup.com/2026-03-17-post.html&lt;/a&gt;&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>devops</category>
      <category>ai</category>
      <category>automation</category>
    </item>
    <item>
      <title>Go Ahead ‘make’ My Day</title>
      <dc:creator>Rob Lauer</dc:creator>
      <pubDate>Fri, 14 Nov 2025 11:33:57 +0000</pubDate>
      <link>https://dev.to/rob_lauer_d8a575ed546516e/go-ahead-make-my-day-3gkp</link>
      <guid>https://dev.to/rob_lauer_d8a575ed546516e/go-ahead-make-my-day-3gkp</guid>
      <description>&lt;p&gt;&lt;a href="https://blog.tbcdevelopmentgroup.com/2025-11-14-post.html" rel="noopener noreferrer"&gt;Last in my 3 part series on GNU make and scriptlets!&lt;/a&gt;&lt;/p&gt;

</description>
      <category>perl</category>
      <category>linux</category>
      <category>gnu</category>
      <category>devops</category>
    </item>
    <item>
      <title>Bump Your Semantic Version</title>
      <dc:creator>Rob Lauer</dc:creator>
      <pubDate>Sun, 20 Apr 2025 14:27:05 +0000</pubDate>
      <link>https://dev.to/rob_lauer_d8a575ed546516e/bump-your-semantic-version-1a38</link>
      <guid>https://dev.to/rob_lauer_d8a575ed546516e/bump-your-semantic-version-1a38</guid>
      <description>&lt;p&gt;While looking at some old &lt;code&gt;bash&lt;/code&gt; script that bumps my semantic&lt;br&gt;
versions I almost puked looking at my old ham handed way of bumping&lt;br&gt;
the version.  That led me to see how I could do it "better".  Why? I&lt;br&gt;
dunno know...bored on a Saturday morning and not motivated enough to&lt;br&gt;
do the NY Times crossword...&lt;/p&gt;

&lt;p&gt;So you want to bump a semantic version string like &lt;code&gt;1.2.3&lt;/code&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;major, minor, or patch - and you don’t want ceremony. You want &lt;strong&gt;one
line&lt;/strong&gt;, no dependencies, and enough arcane flair to scare off
coworkers.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here's a single-line Bash–Perl spell that does exactly that:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;v=$(cat VERSION | p=$1 perl -a -F[.] -pe \
'$i=$ENV{p};$F[$i]++;$j=$i+1;$F[$_]=0 for $j..2;$"=".";$_="@F"')
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  What It Does
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Reads the current version from a &lt;code&gt;VERSION&lt;/code&gt; file (&lt;code&gt;1.2.3&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Increments the part you pass (&lt;code&gt;0&lt;/code&gt; for major, &lt;code&gt;1&lt;/code&gt; for minor, &lt;code&gt;2&lt;/code&gt; for patch)&lt;/li&gt;
&lt;li&gt;Resets all lower parts to zero&lt;/li&gt;
&lt;li&gt;Writes the result to &lt;code&gt;v&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Scriptlet Form
&lt;/h2&gt;

&lt;p&gt;Wrap it like this in a shell function:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;bump&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="nv"&gt;v&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;cat &lt;/span&gt;VERSION | &lt;span class="nv"&gt;p&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt; perl &lt;span class="nt"&gt;-a&lt;/span&gt; &lt;span class="nt"&gt;-F&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;.] &lt;span class="nt"&gt;-pe&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="s1"&gt;'$i=$ENV{p};$F[$i]++;$j=$i+1;$F[$_]=0 for $j..2;$"=".";$_="@F"'&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;
  &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$v&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; VERSION
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;bump 2   # bump patch (1.2.3 =&amp;gt; 1.2.4)
bump 1   # bump minor (1.2.3 =&amp;gt; 1.3.0)
bump 0   # bump major (1.2.3 =&amp;gt; 2.0.0)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  Makefile Integration
&lt;/h1&gt;

&lt;p&gt;Want to bump right from &lt;code&gt;make&lt;/code&gt;?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;bump-major:
    @v=$$(cat VERSION | p=0 perl -a -F[.] -pe '$$i=$$ENV{p};$$F[$$i]++;$$j=$$i+1;$$F[$$_]=0 for $$j..2;$$"=".";$_="$$F"') &amp;amp;&amp;amp; \
    echo $$v &amp;gt; VERSION &amp;amp;&amp;amp; echo "New version: $$v"

bump-minor:
    @$(MAKE) bump-major p=1

bump-patch:
    @$(MAKE) bump-major p=2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or break it out into a &lt;code&gt;.bump-version&lt;/code&gt; script and source it from your build tooling.&lt;/p&gt;

&lt;h2&gt;
  
  
  How It Works (or ...Why I Love Perl)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;-a            # autosplit into @F
-F[.]         # split on literal dot
$i=$ENV{p}    # get part index from environment (e.g., 1 for minor)
$F[$i]++      # bump it
$j=$i+1       # start index for resetting
$F[$_]=0 ...  # zero the rest
$"=".";       # join array with dots
$_="@F"       # set output
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you have to explain this to some junior dev, just say RTFM skippy&lt;br&gt;
&lt;code&gt;perldoc perlrun&lt;/code&gt;. Use the force Luke. &lt;/p&gt;

&lt;p&gt;And if the senior dev wags his finger and say UUOC, tell him &lt;strong&gt;Ego&lt;br&gt;
malum edo&lt;/strong&gt;.&lt;/p&gt;

</description>
      <category>perl</category>
      <category>bash</category>
      <category>programming</category>
      <category>linu</category>
    </item>
  </channel>
</rss>
