這些常式與系統 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 檔案。您也可以透過使用 Config
模組和值 d_pwquota
、d_pwage
、d_pwchange
、d_pwcomment
和 d_pwexpire
,在 Perl 中找出 $quota 和 $comment 欄位的意義,以及您是否有 $expire 欄位。只有當您的供應商以直覺的方式實作影子密碼檔案,才會支援影子密碼檔案,也就是說,如果您在特權下執行,或存在 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::stat
、Net::hostent
、Net::netent
、Net::protoent
、Net::servent
、Time::gmtime
、Time::localtime
和 User::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 會自動且無形地替換執行緒安全版本,而不會發出通知。這表示在某些系統上安全執行的程式碼,可能會在缺少執行緒安全版本的其他系統上失敗。