Сбой с gethost() (используйте Net::hostent)
Я здесь что-то делаю не так и не знаю что. Предполагается, что эта небольшая программа использует 4 IPv4-адреса из списка и использует gethost () от hostent для разрешения Домена. Если это не удается, он сохраняет формат IPv4.
Выход:
180.76.5.59 has a hostname of 180.76.5.59
199.200.9.44 has a hostname of 199.200.9.44
Затем ошибка, которую я получаю:
Can't locate object method "137.48.78.181" via package "Net::hostent" at
./rev.pl line 19 (#1)
(F) You called a method correctly, and it correctly indicated a package
functioning as a class, but that package doesn't define that particular
method, nor does any of its base classes. See perlobj.
Uncaught exception from user code:
Can't locate object method "137.48.78.181" via package "Net::hostent" at ./rev.pl line 19.
at ./rev.pl line 17
17: if (my $ h = gethost ($ host)) 19: $ name = ($ h -> $ name ());
Код:
#!/usr/bin/perl
use Modern::Perl;
use Net::hostent;
use diagnostics;
my @ipaddresses = qw/ 180.76.5.59 199.200.9.44 137.48.78.181 137.48.185.207 /;
#host 137.48.78.181
foreach my $host ( @ipaddresses )
{
my $name = $host;
# my @sysArg = ("host", $host);
# system(@sysArg);
if ( my $h = gethost($host) )
{
$name = ($h->$name());
}
print "$host has a hostname of $name\n";
}
Вы заметите, что я закомментировал команду системного хоста, когда я использую ее, она работает нормально, но я не думал о способе захвата домена (и вывода вывода из строя). Любая помощь высоко ценится.
при использовании системы (@sysArg); Я получаю это:
Host 59.5.76.180.in-addr.arpa not found: 2(SERVFAIL)
Host 44.9.200.199.in-addr.arpa. not found: 3(NXDOMAIN)
181.78.48.137.in-addr.arpa domain name pointer pc-78-181.hpr.unomaha.edu.
207.185.48.137.in-addr.arpa domain name pointer pki174b-01.ist.unomaha.edu.
2 ответа
У вас есть неуместный сигил.
Этот код:
$name = ($h->$name()); # WRONG
... должно быть:
$name = ($h->name());
Can't locate object method "137.48.78.181"
намекает на это: строковое значение $name
использовался в качестве имени метода.
Обратный поиск выполняется с использованием gethostbyaddr
,
use Net::hostnet qw( gethostbyaddr );
use Socket qw( inet_aton );
my $h = gethostbyaddr(inet_aton($ip)));
say $h->name; # Not $h->$name