sub randChar { my ($chars,$len,$inc,$exl) = split /-/, shift; $chars ||= "1"; $len ||= 1; my %map; my $temp = 0; undef @map{ "bob", map { $temp++; $chars =~ /$temp/ ? @$_ : () } [0..9], ["a".."z"], ["A".."Z"], [map chr,34..47,58..64,92..96,123..126] }; undef @map{ "bob", map { /^\d+$/ && $_ < 127 ? chr : () } split/\|/, $inc || "" }; delete @map{ "bob", map { /^\d+$/ && $_ < 127 ? chr : () } split /\|/, $exl || "" }; my @map = keys %map or return; join "",map $map[rand @map],1..$len }