I've concentrated on the characters.pl script. This may or may not help, but I'm not getting the errors that I was getting when I first ran it:
#!/usr/bin/perl
use strict;
use warnings;
use diagnostics;
foreach my $name (keys my %characters) {
my $id = $name;
$id =~ s/ /_/g;
$id =~ s/[^-\w:.]//g;
my $experience = $characters{$name}{'experience'};
my(@classes) = @{$characters{$name}{'classes'};};
print qq[<h1 id="$id">$name</h1>\n];
print "\t<p>" . print_classes($experience, @classes) . "</p>\n";
print "\t<p>Experience: $experience</p>\n";
}