This is quite easy: you want single letters between ':'s to be sorted as if they were without the ':'. As we're at it, we do a case-insensitive sort. That's the beauty of perl hashes! :-)
use strict;
my %aq = map ( (lc ((/^:(.):/) ? $1 : $_) => $_) , <DATA>);
foreach my $k ( sort keys %aq ) { print $aq{$k}; }
__DATA__
D for Donkey
B for Box
B for Bubble
C for Cat
A for Alpha
:A:
:B:
:C:
:D:
This stuff prints:
:A:
A for Alpha
:B:
B for Box
B for Bubble
:C:
C for Cat
:D:
D for Donkey
Hope this is what you were looking for.