Net::hostent - 通过名称访问 Perl 内置 gethost*() 函数
use Net::hostent;
此模块的默认导出覆盖了核心 gethostbyname() 和 gethostbyaddr() 函数,用返回 "Net::hostent" 对象的版本替换它们。此对象具有返回 C 语言 netdb.h 中 hostent 结构的同名结构字段名称的方法;即 name、aliases、addrtype、length 和 addr_list。aliases 和 addr_list 方法返回数组引用,其余返回标量。addr 方法等效于 addr_list 数组引用中的第零个元素。
您也可以使用 :FIELDS 导入标签将所有结构字段直接导入到您的命名空间中作为普通变量。(请注意,这仍然会覆盖您的核心函数。)将这些字段作为以 h_
开头的变量访问。因此,如果您导入字段,$host_obj->name()
将对应于 $h_name。数组引用可用作普通数组变量,例如 @{ $host_obj->aliases() }
将简化为 @h_aliases。
gethost() 函数是一个简单的前端,它通过 Socket::inet_aton 将数字参数转发给 gethostbyaddr(),并将其余参数转发给 gethostbyname()。
要访问此功能而不使用核心覆盖,请将use
传递一个空的导入列表,然后使用其完全限定名称访问函数。另一方面,内置函数仍然可以通过CORE::
伪包访问。
use Net::hostent;
use Socket;
@ARGV = ('netscape.com') unless @ARGV;
for $host ( @ARGV ) {
unless ($h = gethost($host)) {
warn "$0: no such host: $host\n";
next;
}
printf "\n%s is %s%s\n",
$host,
lc($h->name) eq lc($host) ? "" : "*really* ",
$h->name;
print "\taliases are ", join(", ", @{$h->aliases}), "\n"
if @{$h->aliases};
if ( @{$h->addr_list} > 1 ) {
my $i;
for $addr ( @{$h->addr_list} ) {
printf "\taddr #%d is [%s]\n", $i++, inet_ntoa($addr);
}
} else {
printf "\taddress is [%s]\n", inet_ntoa($h->addr);
}
if ($h = gethostbyaddr($h->addr)) {
if (lc($h->name) ne lc($host)) {
printf "\tThat addr reverses to host %s!\n", $h->name;
$host = $h->name;
redo;
}
}
}
虽然此类目前使用 Class::Struct 模块来构建类似结构的类,但你不应该依赖于此。
Tom Christiansen