Keep related state as named scalar values.

state-records State is easier to reason about when each field has a clear name.

State Records

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

package Badge;

sub summary {
    my ($name, $level) = @_;
    return "$name:$level";
}

package main;

my $level = 2;
my $name = "Rin";
my $summary = Badge::summary($name, $level);

print "name=$name\n";
print "level=$level\n";
print "summary=$summary\n";
use strict;
use warnings;

package Badge;

sub summary {
    my ($name, $level) = @_;
    return "$name:$level";
}

package main;

my $level = 1;
my $name = "Rin";
my $summary = Badge::summary($name, $level);

print "name=$name\n";
print "level=$level\n";
print "summary=$summary\n";
use strict;
use warnings;

package Badge;

sub summary {
    my ($name, $level) = @_;
    return "$name:$level";
}

package main;

my $level = 5;
my $name = "Rin";
my $summary = Badge::summary($name, $level);

print "name=$name\n";
print "level=$level\n";
print "summary=$summary\n";
  1. $level ← 2, $name ← Rin

    13my $level→ 2 = 2; #@level=1, 514my $name→ Rin = "Rin";15my $summary = Badge::summary($nameRin, $level2);
  2. $name ← Rin, $level ← 2

    6sub summary {7    my ($name→ Rin, $level→ 2) = @_;8    return "$nameRin:$level2";9}
  3. $summary ← Rin:2

    14my $name = "Rin";15my $summary→ Rin:2 = Badge::summary($nameRin, $level2);1617print "name=$nameRin\n";18print "level=$level2\n";19print "summary=$summaryRin:2\n";
    outputname=Rin
    level=2
    summary=Rin:2
  1. $level ← 1, $name ← Rin

    13my $level→ 1 = 1;14my $name→ Rin = "Rin";15my $summary = Badge::summary($nameRin, $level1);
  2. $name ← Rin, $level ← 1

    6sub summary {7    my ($name→ Rin, $level→ 1) = @_;8    return "$nameRin:$level1";9}
  3. $summary ← Rin:1

    14my $name = "Rin";15my $summary→ Rin:1 = Badge::summary($nameRin, $level1);1617print "name=$nameRin\n";18print "level=$level1\n";19print "summary=$summaryRin:1\n";
    outputname=Rin
    level=1
    summary=Rin:1
  1. $level ← 5, $name ← Rin

    13my $level→ 5 = 5;14my $name→ Rin = "Rin";15my $summary = Badge::summary($nameRin, $level5);
  2. $name ← Rin, $level ← 5

    6sub summary {7    my ($name→ Rin, $level→ 5) = @_;8    return "$nameRin:$level5";9}
  3. $summary ← Rin:5

    14my $name = "Rin";15my $summary→ Rin:5 = Badge::summary($nameRin, $level5);1617print "name=$nameRin\n";18print "level=$level5\n";19print "summary=$summaryRin:5\n";
    outputname=Rin
    level=5
    summary=Rin:5