That's better than what I thought I read, though you could cut the resolver overhead just as much by checking against each hostname before you look it up to see if it's been looked up before. This sort of task is just begging for a hash. That would use one loop instead of two, and probably be simpler to follow.
my %looked_up;
my @urls = qw( list of URLS however you got them );
my @ips;
foreach ( @urls ) {
my $hostname = extract_hostname_from_url( $_ );
unless ( exists $looked_up{ $hostname ) {
my $packed_ip = gethostbyname( $hostname );
if (defined $packed_ip) {
$ip_address = inet_ntoa($packed_ip);
push @ips, $ip_address;
$looked_up{ $hostname } = 1;
}
}
}
# do with @ips whatever you were going to do with them
This retries hostname lookups that fail. You could change that easily by moving the autovivifying hash element assignment outside the if block for the packed IP address being defined.
the sub extract_hostname_from_url is left as an exercise.
|