内容

名称

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