A pure function is easier to test because the same input gives the same output.

pure function A pure function calculates from its arguments without changing outside state.

Pure Functions

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

sub final_price {
    my ($price, $discount) = @_;
    return $price - $discount;
}

my $discount = 2;
my $price = 12;
my $actual = final_price($price, $discount);
my $expected = $price - $discount;
my $status = $actual == $expected ? "pass" : "fail";

print "discount=$discount\n";
print "actual=$actual\n";
print "status=$status\n";
use strict;
use warnings;

sub final_price {
    my ($price, $discount) = @_;
    return $price - $discount;
}

my $discount = 0;
my $price = 12;
my $actual = final_price($price, $discount);
my $expected = $price - $discount;
my $status = $actual == $expected ? "pass" : "fail";

print "discount=$discount\n";
print "actual=$actual\n";
print "status=$status\n";
use strict;
use warnings;

sub final_price {
    my ($price, $discount) = @_;
    return $price - $discount;
}

my $discount = 5;
my $price = 12;
my $actual = final_price($price, $discount);
my $expected = $price - $discount;
my $status = $actual == $expected ? "pass" : "fail";

print "discount=$discount\n";
print "actual=$actual\n";
print "status=$status\n";
  1. $discount ← 2, $price ← 12

    9my $discount→ 2 = 2; #@discount=0, 510my $price→ 12 = 12;11my $actual = final_price($price12, $discount2);12my $expected = $price - $discount;
  2. $price ← 12, $discount ← 2

    4sub final_price {5    my ($price→ 12, $discount→ 2) = @_;6    return $price12 - $discount2;7}
  3. $actual ← 10, $expected ← 10, $status ← pass

    10my $price = 12;11my $actual→ 10 = final_price($price12, $discount2);12my $expected→ 10 = $price12 - $discount2;13my $status→ pass = $actual10 == $expected10 ? "pass" : "fail";1415print "discount=$discount2\n";16print "actual=$actual10\n";17print "status=$statuspass\n";
    outputdiscount=2
    actual=10
    status=pass
  1. $discount ← 0, $price ← 12

    9my $discount→ 0 = 0;10my $price→ 12 = 12;11my $actual = final_price($price12, $discount0);12my $expected = $price - $discount;
  2. $price ← 12, $discount ← 0

    4sub final_price {5    my ($price→ 12, $discount→ 0) = @_;6    return $price12 - $discount0;7}
  3. $actual ← 12, $expected ← 12, $status ← pass

    10my $price = 12;11my $actual→ 12 = final_price($price12, $discount0);12my $expected→ 12 = $price12 - $discount0;13my $status→ pass = $actual12 == $expected12 ? "pass" : "fail";1415print "discount=$discount0\n";16print "actual=$actual12\n";17print "status=$statuspass\n";
    outputdiscount=0
    actual=12
    status=pass
  1. $discount ← 5, $price ← 12

    9my $discount→ 5 = 5;10my $price→ 12 = 12;11my $actual = final_price($price12, $discount5);12my $expected = $price - $discount;
  2. $price ← 12, $discount ← 5

    4sub final_price {5    my ($price→ 12, $discount→ 5) = @_;6    return $price12 - $discount5;7}
  3. $actual ← 7, $expected ← 7, $status ← pass

    10my $price = 12;11my $actual→ 7 = final_price($price12, $discount5);12my $expected→ 7 = $price12 - $discount5;13my $status→ pass = $actual7 == $expected7 ? "pass" : "fail";1415print "discount=$discount5\n";16print "actual=$actual7\n";17print "status=$statuspass\n";
    outputdiscount=5
    actual=7
    status=pass