Well, you're code's pretty rough, but i'll try and pinpoint the immediate problem:
write STDOUT if defined($registrant and $admin and $tech and $billing
+and $names[2] and $expires);
If the above test evaluates to true, you should also exit the
OUTER loop, thus;
if defined($registrant and $admin and $tech and $billing and $names[2]
+ and $expires){
write STDOUT;
last OUTER;
}
Otherwise the loop will keep on recurring and print your results several times.
I would also suggest that a
much better way of doing this would be to take the test out of the loop entirely.
Also, you may want to take a look at the
Net::Whois module.