目錄

名稱

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() 函式是一個簡單的前端,它將數字參數轉發給 gethostbyaddr(),通過 Socket::inet_aton,以及其餘的參數轉發給 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