An unless block runs only when a condition is false, which makes it useful for guard checks.

guard A guard handles a special case before the main path continues.

Unless Guard

name
unless_guard.pl
Replay: real traced execution (multi-file project)
use strict;
use warnings;

my $name = "";
my $message;

unless (length $name) {
    $message = "missing name";
} else {
    $message = "hello $name";
}

print "name=$name\n";
print "message=$message\n";
use strict;
use warnings;

my $name = "Mira";
my $message;

unless (length $name) {
    $message = "missing name";
} else {
    $message = "hello $name";
}

print "name=$name\n";
print "message=$message\n";
use strict;
use warnings;

my $name = "Kai";
my $message;

unless (length $name) {
    $message = "missing name";
} else {
    $message = "hello $name";
}

print "name=$name\n";
print "message=$message\n";
  1. $name ← (empty), $message ← (empty)

    4my $name→ (empty) = ""; #@name="Mira", "Kai"5my $message→ (empty);
  2. $message ← missing name

    7unless (length $name(empty)) {8    $message→ missing name = "missing name";9} else {
  3. print "name=$name ";

    13print "name=$name(empty)\n";14print "message=$messagemissing name\n";
    outputname=
    message=missing name
  1. $name ← Mira, $message ← (empty)

    4my $name→ Mira = "Mira";5my $message→ (empty);
  2. $message ← hello Mira

    8    $message = "missing name";9} else {10    $message→ hello Mira = "hello $nameMira";11}
  3. print "name=$name ";

    13print "name=$nameMira\n";14print "message=$messagehello Mira\n";
    outputname=Mira
    message=hello Mira
  1. $name ← Kai, $message ← (empty)

    4my $name→ Kai = "Kai";5my $message→ (empty);
  2. $message ← hello Kai

    8    $message = "missing name";9} else {10    $message→ hello Kai = "hello $nameKai";11}
  3. print "name=$name ";

    13print "name=$nameKai\n";14print "message=$messagehello Kai\n";
    outputname=Kai
    message=hello Kai

Guard the Missing Name

  1. $name starts as an empty string.
  2. length $name is 0, which is false.
  3. unless runs because the condition is false.
  4. $message becomes missing name. | Name | Branch | Message | | --- | --- | --- | | empty string | unless | missing name | | Mira | else | hello Mira | | Kai | else | hello Kai |

Exercise: unless_guard.pl

Use unless to handle a missing name and otherwise print hello with the name