Check a divisor before calculating.

guarded-operation A guard branch can turn a risky calculation into a clear status.

Guarded Operation

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

my $denominator = 2;
my $status;
my $result;

if ($denominator == 0) {
    $status = "blocked";
    $result = "n/a";
} else {
    $status = "ok";
    $result = 20 / $denominator;
}

print "denominator=$denominator\n";
print "status=$status\n";
print "result=$result\n";
use strict;
use warnings;

my $denominator = 0;
my $status;
my $result;

if ($denominator == 0) {
    $status = "blocked";
    $result = "n/a";
} else {
    $status = "ok";
    $result = 20 / $denominator;
}

print "denominator=$denominator\n";
print "status=$status\n";
print "result=$result\n";
use strict;
use warnings;

my $denominator = 5;
my $status;
my $result;

if ($denominator == 0) {
    $status = "blocked";
    $result = "n/a";
} else {
    $status = "ok";
    $result = 20 / $denominator;
}

print "denominator=$denominator\n";
print "status=$status\n";
print "result=$result\n";
  1. $denominator ← 2, $status ← (empty), $result ← (empty)

    4my $denominator→ 2 = 2; #@denominator=0, 55my $status→ (empty);6my $result→ (empty);
  2. $status ← ok, $result ← 10

    10    $result = "n/a";11} else {12    $status→ ok = "ok";13    $result→ 10 = 20 / $denominator2;14}
  3. print "denominator=$denominator ";

    16print "denominator=$denominator2\n";17print "status=$statusok\n";18print "result=$result10\n";
    outputdenominator=2
    status=ok
    result=10
  1. $denominator ← 0, $status ← (empty), $result ← (empty)

    4my $denominator→ 0 = 0;5my $status→ (empty);6my $result→ (empty);
  2. $status ← blocked, $result ← n/a

    8if ($denominator0 == 0) {9    $status→ blocked = "blocked";10    $result→ n/a = "n/a";11} else {
  3. print "denominator=$denominator ";

    16print "denominator=$denominator0\n";17print "status=$statusblocked\n";18print "result=$resultn/a\n";
    outputdenominator=0
    status=blocked
    result=n/a
  1. $denominator ← 5, $status ← (empty), $result ← (empty)

    4my $denominator→ 5 = 5;5my $status→ (empty);6my $result→ (empty);
  2. $status ← ok, $result ← 4

    10    $result = "n/a";11} else {12    $status→ ok = "ok";13    $result→ 4 = 20 / $denominator5;14}
  3. print "denominator=$denominator ";

    16print "denominator=$denominator5\n";17print "status=$statusok\n";18print "result=$result4\n";
    outputdenominator=5
    status=ok
    result=4