The character class \w matches an alphanumeric character, so it matches a digit as well as a letter (or underscore). You need a character class which excludes digits. But \D includes anything not a digit, so it matches whitespace. A negated character class [^\d\s] will match a character that is neither a digit nor a space:
my @names = $text =~ /\b[^\d\s]*\d[^\d\s]*\b/g;
Or, more simply, specify the letters you want to match explicitly (note the /i modifier to make the regex case-insensitive):
my @names = $text =~ /\b[A-Z]*\d[A-Z]*\b/gi;
See the section “Character Classes and other Special Escapes” in perlre#Regular-Expressions.
Hope that helps,