Algorithm-Step
view release on metacpan or search on metacpan
lib/Algorithm/Step.pm view on Meta::CPAN
my @algstack = ();
my $curralg;
sub algorithm {
my ($name, $desc) = @_;
if (!exists $algs->{$name}) {
$algs->{$name} = {};
$algs->{$name}->{desc} = $desc;
$algs->{$name}->{steps} = {};
}
push @algstack, $name;
$curralg = $name;
}
sub step {
my @args = @_;
my $argc = @_;
my $refstep = $algs->{$curralg};
foreach (0 .. $argc-2) {
if (!exists $refstep->{steps}) {
$refstep->{steps} = {};
}
$refstep = $refstep->{steps};
if (!exists $refstep->{$args[$_]}) {
$refstep->{$args[$_]} = {};
$refstep->{$args[$_]}->{desc} = $args[$argc-1];
$refstep->{$args[$_]}->{count} = 0;
}
$refstep=$refstep->{$args[$_]};
}
$refstep->{count}++;
}
sub statistics {
print "\nSTATISTICS\n\n";
foreach (keys %{$algs}) {
print "Algorithm $_: $algs->{$_}->{desc}\n";
my $name = $_;
foreach (sort keys %{$algs->{$name}->{steps}}) {
print_step($algs->{$name}->{steps}->{$_}, $_, 0);
}
}
}
sub print_step {
my ($step, $id, $indent) = @_;
my $i;
for ($i = 0; $i < $indent; $i++) {
print " ";
}
print pad_dots("STEP $id. $step->{desc} ", 72), " [$step->{count}]\n";
if (exists $step->{steps}) {
foreach (sort keys %{$step->{steps}}) {
print_step($step->{steps}->{$_}, "$id.$_", $indent+1);
}
}
}
sub pad_dots {
my ($s, $len) = @_;
return $s if $len <= (length $s);
return $s . "." x ($len - length $s);
}
sub end_algorithm {
pop @algstack;
$curralg = pop @algstack;
push @algstack, $curralg;
}
1;
__END__
=head1 NAME
MyStep - Trace execution steps of an algorithm
=head1 SYNOPSIS
use Algorithm::Step;
use integer;
algorithm "P", "Print table of 500 primes";
my @PRIME = ();
step 1, "Start table, PRIME[1] <- 2, PRIME[2] <- 3";
$PRIME[1] = 2;
$n = 3;
$j = 1;
$PRIME[++$j] = $n;
while ($j < 500) {
step 2, "Advance n by 2";
$n += 2;
step 3, "k <- 1";
$k = 1;
do {
step 4, "Increase k";
++$k;
step 5, "Divide n by PRIME[k]";
$q = $n / $PRIME[$k];
$r = $n % $PRIME[$k];
step 6, "Remainder zero?";
next if $r == 0;
step 7, "PRIME[k] large?";
} while ($q > $PRIME[$k]);
step 8, "n is prime";
$PRIME[++$j] = $n;
}
step 9, "Print result";
print "FIRST FIVE HUNDRED PRIMES\n";
( run in 1.814 second using v1.01-cache-2.11-cpan-cdf2f3d4e48 )