Heap's Algorithm and Generating Perl Code From Pseudocode

I've been researching recursion lately and in particular, permutations algorithms. This interest was spurred by a real-life case where such an algorithm would come in handy (combinations of @clients, @users, @tickets). I came across Wikipedia's entry for Heap's algorithm and the pseudocode illustrating the algorithm. I found the non-recursive version even more interesting specifically for its lack of needing to call itself, so I chose that version of the algorithm to study.

="http://tinypig2.blogspot.com/2016/12/heaps…

Tattletale Variables

Sometimes you might be faced with a huge program that, somewhere, is changing a variable's value to something undesired.

http://tinypig2.blogspot.com/2016/09/tattletale-variables.html

Dispatch Tables


use strict;
use warnings;

sub greet            { print "Hello!\n"       }
sub inquire          { print "How are you?\n" }
sub bye              { print "Farewell!\n"    }
sub delete_all_files { print "*KABOOM*\n"     }

sub insecure_call {
    no strict 'refs';
    shift->();
}

insecure_call('greet');
insecure_call('inquire');
insecure_call('bye');
insecure_call('delete_…

Accepting Input from Multiple Sources

One of the corners I often paint myself into when developing a tool is only accepting one type of input, usually STDIN, the standard input stream, like a pipeline (ex: cat fruit.txt | grep apple) or a redirect (ex: grep apple < fruit.txt)

What inevitably happens is I end up wanting the tool to work like any Unix tool and accept different kinds of input (filenames or arguments on the command line, for example.)

Finally I got fed up with it and added a function called multi_input()/var/www/users/tinypig/index.html

Saving Vertical Space

I was reviewing some code I had written for a simple RPG dice algorithm (although there's already a good module for this, Game::Dice) and I realized again that I have a prefererence for functions that can fit on one screen. One strategy is breaking up the code into smaller routines but I sometimes like to compact it vertically as much as possible first.

This function roll, given a string of "dice language," should return the results of such a dice roll. An example of this would be "3d10+1" to roll t…