Speaking of Guard, I almost forgot about defer.

In recent post [En guarde! Playing with Guard][] we took a look at Guard, and I was almost forgetting about a similar functionality that has been baked into our beloved Perl interpreter: defer.

It more or less covers of the functionality of scope_guard, so depending on the interpreter that you can count on it might go as a total replacement if we don’t need anything fancier (like the possibility to change our mind at some later-yet-intermediate stage).

Transforming our first program from the previous post is straightforward, keeping in mind that defer takes a block of code (not a code reference):

#!/usr/bin/env wrapperl
use v5.38;
use warnings;
use experimental 'defer';


scoped(shift // 'die');

sub scoped ($what) {
   defer { en_guarde() }
   if ($what eq 'die') {
      die "whatever!";
   elsif ($what eq 'return') {
      say 'about to return...';
   elsif ($what eq 'exit') {
      say 'exiting...';
      exit 1;
   else {
      say 'dumpiiiing!';

sub en_guarde { warn "en_guarde(@_)!" }

The result is the same as the Guard case:

$ ./ die
whatever! at ./ line 13.
en_guarde()! at ./ line 29.

$ ./ return
about to return...
en_guarde()! at ./ line 29.

$ ./ exit
en_guarde()! at ./ line 29.

$ ./ dump

So well, I think that Guard still makes a lot of sense until pre-5.36 interpreter will be significantly around, or sophisticated guards are needed. Otherwise… you can defer its installation!

Comments? Octodon, , GitHub, Reddit, or drop me a line!