in reply to multidimensional arrays

Another idea would be to have a hash for every move. In other words, instead of:
my %bad = ( '12598' => {}, # data about bad sequence '19203' => {}, # data about other bad sequence )
you could have something like:
$bad->{1}{2}{5}{9}{8} = 0;
That way, you could keep a pointer to the current move history just by looking up each move as it's made, and keeping a variable with the last lookup value in it. (Of course, that won't work if you're implementing this as a CGI, but...) Then, the program can just check to see if 8 would be a bad move by seeing if $move->{8} is equal to zero.

For a full discussion and mini-rant on the subject of having variables named at runtime, see Mark-Jason Dominus' article on the subject here: http://www.plover.com/~mjd/perl/varvarname.html

stephen