# create a nice IO::Select object with a bunch of sockets... then while ( my @ready = $select->can_read(30) ) { foreach (@ready) { my $result = sysread($_, $domains{$_}[2], 128$domains{$_}[3]); # domains is just a local data structure where elements [2] and [3] are the WHOIS results returned so far, and the offset unless (defined $result){ $domains{$_}[0]{result} = "no_connect"; $select -> remove($_); $_->close; next; }; if ( $domains{$_}[2] =~ /$domains{$_}[1]/ ) { $domains{$_}[0]{result} = "avail"; $select -> remove($_); $_->close; next; } unless ($result) { $domains{$_}[0]{result} = "unav"; $select -> remove($_); $_->close; next; } $domains{$_}[3] += $result; } foreach ($select -> has_exception ) { $select->remove($_); $_->close; }; }