in reply to Getting regular expression right

sub split {
Do you really want to call this split()? IMHO it's not a good idea, I recommend you try something along the lines of mysplit() instead.
my %key; if ($_[0] =~ /^(.+?):(.+?)$/) {
This may be largely a matter of personal preferences, but I think you'd be better off shift()ing 'into' a more descriptive variable (or maybe a local()ised $_).
$key{'name'} = $1; $key{'definition'} = $2; $key{'altdefinition'} = '';
Also you may use the match operator's return value in list context. Maybe you knew and maybe you didn't. No harm done mentioning the possibility, IMHO.
} elsif ($_[0] =~ /^(.+?)\|(.+?)$/) { $key{'name'} = $1; $key{'altdefinition'} = $2; $key{'definition'} = '';
In my personal experience I find that in Perl cascaded elseifs are seldom really necessary and in general they also rarely add to clarity or conciseness.

I may be wrong, but couldn't you choose just one separator? Also I think you'd be better off using a real split() on such a separator (and possibly do some checks on the return values, e.g. to avoid 'uninitialized' warnings)...

What characters should i choose to be delimeters, and how could this be made "foolproof"?
You cannot make it foolprof for as soon as you'll think you have, along a better fool will come!