Hopefully if you're parsing a log file you won't get this sort of garbage input, but it is better to be safe than sorry. Instead of writing the regexp to end all regexps, which many have made a
noble effort of doing, maybe using this admittedly slack one with some post-processing is the best bet.
use Socket;
# ...
if ($line =~ /\b(\d{1,3}(?:\d{1,3}){3}\b/)
{
if (my $in_addr = inet_aton($1))
{
if ($name = gethostbyname($in_addr, AF_INET))
{
# ...
}
}
}
inet_aton will reject any bad input, such as 999.999.999.999, meaning that
gethostbyname will not even try to resolve these.
As a side-note,
gethostbyname can take a very, very long time to return input if the name-servers for that address block are down. If you are trying to bulk-resolve, you might want to use a tool which does this more efficiently, such as
dnsfilter from the
DJB DNS package. A
Perl solution is also available from CPAN.