I like that perl has stuff like ...

... is a 3-in-one power house

I like that perl has stuff like ...

.. goes by many names, but it is actually 3 fairly neat things. perldoc

yada-yada - a placeholder for unimplemented code.

In void context ... is the "yada yada". It is fatal and dies with "unimplemented".

You can use this while planning out a module. You can quickly throw down a

sub write_me_later { ... }

... and when you call it (say from your tests) perl will remind you that you haven't written that sub yet.

A flip flop - with set/reset!

In scalar context it returns true after the thing on the left is true, until the thing on the right becomes true.

This is the set/reset behaviour of a "flip flop", and it is really helpful when parsing lines of a file.

while(<>) {
    if (/flip/.../flop/) {
        # every line between a flip and a flop (including the lines that do)
        say "flipped: $_"
    }
}

Simply /start-of-range/../end-of-range/ is true between those two matches.

Ranges - trade two numbers for many!

Unsurprisingly in list context ... gives a list, it works with similar rules to ++, so: - 1..10 gives you back the numbers you expect. - "OWF1".."OWF9" gives you back a list that includes "OWF6"

It's particularly handy for avoiding off-by-one's when looping over arrays:

for (0..$#array) { # No < @array... or is it <= @array?
    printf "I'm at index %s, which is: %s\n", $_, $array[$_] 
}

It all comes from context

I think it's very cool that 2 or 3 characters can do all of these things, and that their meaning comes entirely from the context.

That's it.

I just think that's neat.

I'll fix it later

proof-post-icon

Come on man, it's an emergency, and we need to fix this right away, so ...

"I'll fix it later"

I mean far be it from me to suggest that you're making that up.

I believe we should give people the benifit of the doubt.

People wouldn't simply lie during a code review to get me to approve a thing and then just ... never follow up...

so, show me one

Fundimentally, we have to assume we're working with good faith actors, right?

So it seems fair to just approve the PR, once they show a pair of commits where:

  • The first one sucks, but they said "i got u next time dawg" and
  • The second one actually fixed the suck from the first commit.

Oneliners? In my crontab?

You can neatly put all your logic into a signle class, and then have a nice little factory that looks at @ARGV.

If your class has prod configs as defaults, then your crontab looks like this:

* * * * * perl -MMyApp::Script::CleanupExpiredEntries \
                -E'MyApp::Script::CleanupExpiredEntries->new_from_args->run'

Because you don't have any code in a bin/run-me script, you can neatly write tests for all your functions by either sub-classing your ::Script to replace your database access logic or by by straight-up replacing the method for the duration of your sub-test with

{
    local *MyApp::Script::CleanupExpiredEntries::fetch_from_db = sub  { ...}
    ...
}

The most notable downside is that some day someone might introduce some code that uses Log::Log4perl, and a config config that references $0:

log4perl.appender.LOGFILE.filename=sub {
    my $name = ( map s{ [.]pl $ }{}xr, split m{/}, $0 )[-1];
    "/var/log/$name/$name.log" }

which means you'll get a mail a minute saying:

 Can't sysopen /var/log/-e/-e.log (No such file or directory)
    at /usr/share/perl5/Log/Log4perl/Appender/File.pm line 140.

which might not be the kind of thing you want to see after taking a couple of days off.