這些例程與系統 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_pwquota
、d_pwage
、d_pwchange
、d_pwcomment
和 d_pwexpire
。只有在您的供應商以直覺的方式實作影子密碼檔案時,才會支援影子密碼檔案,也就是說,如果您在特權下執行,或存在 shadow(3) 函式(如 System V 中所述,包括 Solaris 和 Linux),則會取得影子版本。實作專有影子密碼功能的系統不太可能受到支援。
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);
}
請確定在 SCALAR 環境中呼叫 gethostbyname
,並檢查其傳回值是否已定義。
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 會自動且無形地取代執行緒安全版本,而不會發出通知。這表示在某些系統上安全執行的程式碼,可能會在缺少執行緒安全版本的其他系統上失敗。