Ah,
kvale has beaten me to the regex solution. Ok, I will post a slightly different one...
#!/usr/bin/perl -w
# vim: set tabstop=3
use strict;
while (<DATA>)
{
chomp;
print "$_ .. ";
if (m/^((?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9]).*)$
(??{ ! exists %{{qw! 5 0 6 0 7 0 8 0 !}}->{length($1)} })/x)
{
print "valid\n"
} else {
print "invalid\n"
}
}
__DATA__
1245Za78
1245Za7b8
45a7b8
a78Z
12Three
kMdlOz
6KYX
diImMU1Y
ZNw4uWSht
jDqvSN
qVRR
le2WTQv
us1j3SerC
OZv0LtSJ
9qyscg
LbX7o74
80TeRHq
7YIiXnEV8
e1Yctl9
8iGoc
R87MeDCFz
ziTnlk
cziP