getpwnam 名稱
getgrnam 名稱
gethostbyname 名稱
getnetbyname 名稱
getprotobyname 名稱
getpwuid UID
getgrgid GID
getservbyname 名稱,協定
gethostbyaddr ADDR,ADDRTYPE
getnetbyaddr ADDR,ADDRTYPE
getprotobynumber 數字
getservbyport 埠,協定
getpwent
getgrent
gethostent
getnetent
getprotoent
getservent
setpwent
setgrent
sethostent STAYOPEN
setnetent STAYOPEN
setprotoent STAYOPEN
setservent STAYOPEN
endpwent
endgrent
endhostent
endnetent
endprotoent
endservent

這些常式與系統 C 函式庫中的對應常式相同。在清單內容中,各種 get 常式的回傳值如下

#    0        1          2           3         4
my ( $name,   $passwd,   $gid,       $members  ) = getgr*
my ( $name,   $aliases,  $addrtype,  $net      ) = getnet*
my ( $name,   $aliases,  $port,      $proto    ) = getserv*
my ( $name,   $aliases,  $proto                ) = getproto*
my ( $name,   $aliases,  $addrtype,  $length,  @addrs ) = gethost*
my ( $name,   $passwd,   $uid,       $gid,     $quota,
   $comment,  $gcos,     $dir,       $shell,   $expire ) = getpw*
#    5        6          7           8         9

(如果項目不存在,回傳值為單一無意義的 true 值。)

$gcos 欄位的確切含義會有所不同,但通常包含使用者的真實姓名 (與登入名稱相反) 以及與使用者相關的其他資訊。不過請注意,在許多系統中,使用者可以變更這些資訊,因此無法信賴,而且 $gcos 因此會受到污染 (請參閱 perlsec)。$passwd 和 $shell,使用者的加密密碼和登入 shell,也會受到污染,原因相同。

在純量內容中,您會取得名稱,除非函式是透過名稱查詢,在這種情況下,您會取得其他項目,無論是什麼項目。(如果項目不存在,您會取得未定義值。)例如

my $uid   = getpwnam($name);
my $name  = getpwuid($num);
my $name  = getpwent();
my $gid   = getgrnam($name);
my $name  = getgrgid($num);
my $name  = getgrent();
# etc.

getpw*() 中,欄位 $quota、$comment 和 $expire 很特別,因為它們在許多系統上不受支援。如果 $quota 不受支援,它會是一個空的純量。如果它受支援,它通常會編碼磁碟配額。如果 $comment 欄位不受支援,它會是一個空的純量。如果它受支援,它通常會編碼一些關於使用者的管理員註解。在某些系統中,$quota 欄位可能是 $change 或 $age,這些欄位與密碼老化有關。在某些系統中,$comment 欄位可能是 $class。如果 $expire 欄位存在,它會編碼帳戶或密碼的到期期限。有關這些欄位在您的系統中的可用性和確切含義,請參閱 getpwnam(3) 和您系統的 pwd.h 檔案。您也可以透過 Perl 找出 $quota 和 $comment 欄位的含義,以及您是否有 $expire 欄位,方法是使用 Config 模組和值 d_pwquotad_pwaged_pwchanged_pwcommentd_pwexpire。只有當您的供應商以直觀的方式實作影子密碼檔案時,才會支援影子密碼檔案,也就是說,如果您在特權下執行,或存在 shadow(3) 函式(如 System V 中所見,包括 Solaris 和 Linux),則呼叫常規 C 函式庫常式會取得影子版本。實作專有影子密碼功能的那些系統不太可能受到支援。

getgr*() 傳回的 $members 值是群組成員的登入名稱的空格分隔清單。

對於 gethost*() 函式,如果 C 中支援 h_errno 變數,如果函式呼叫失敗,它會透過 $? 傳回給您。成功呼叫傳回的 @addrs 值是對應函式庫呼叫傳回的原始位址清單。在網際網路網域中,每個位址長度為四個位元組;您可以透過說類似以下內容來解壓縮它

my ($w,$x,$y,$z) = unpack('W4',$addr[0]);

Socket 函式庫讓這件事變得稍微容易一些

use Socket;
my $iaddr = inet_aton("127.1"); # or whatever address
my $name  = gethostbyaddr($iaddr, AF_INET);

# or going the other way
my $straddr = inet_ntoa($iaddr);

相反地,若要將主機名稱解析為 IP 位址,您可以撰寫以下內容

use Socket;
my $packed_ip = gethostbyname("www.perl.org");
my $ip_address;
if (defined $packed_ip) {
    $ip_address = inet_ntoa($packed_ip);
}

請確定 gethostbyname 在 SCALAR 環境中被呼叫,並且檢查其傳回值是否已定義。

getprotobynumber 函式即使只有一個引數,但具有清單運算子的優先順序,因此請小心

getprotobynumber $number eq 'icmp'   # WRONG
getprotobynumber($number eq 'icmp')  # actually means this
getprotobynumber($number) eq 'icmp'  # better this way

如果您厭倦了記住回傳清單的哪個元素包含哪個回傳值,標準模組中提供了依名稱介面:File::statNet::hostentNet::netentNet::protoentNet::serventTime::gmtimeTime::localtimeUser::grent。這些會覆寫正常的內建函式,提供回傳物件的版本,其中每個欄位都有適當的名稱。例如

use File::stat;
use User::pwent;
my $is_his = (stat($filename)->uid == pwent($whoever)->uid);

即使看起來像是相同的函式呼叫 (uid),但它們並非如此,因為 File::stat 物件與 User::pwent 物件不同。

在多執行緒環境中,其中有多個執行緒可能使用這些函式,這些函式中的許多並非安全的。特別是,像 getpwent() 的函式會逐處理序反覆執行,而非逐執行緒反覆執行,因此如果兩個執行緒同時反覆執行,則兩者都無法取得所有記錄。

有些系統具有某些函式的執行緒安全版本,例如 getpwnam_r() 取代 getpwnam()。在那裡,Perl 會自動且無形地替換為執行緒安全版本,而不會通知。這表示在某些系統上安全執行的程式碼,可能會在缺乏執行緒安全版本的其他系統上失敗。

移植性問題:perlport 中的「getpwnam」perlport 中的「endservent」