这些例程与系统C库中的对应例程相同。在列表上下文中,各个get例程的返回值如下:
($name、$passwd、$uid、$gid、,$quota、$comment、$gcos、$dir、$shell、$expire)=获取密码*($name,$passwd,$gid,$members)=获取*($name,$aliases,$addrtype,$length,@addrs)=获取主机*($name,$aliases,$addrtype,$net)=getnet*($name,$alias,$proto)=getproto*($name,$aliases,$port,$proto)=获取服务*
(如果条目不存在,则会得到一个空列表。)
$gcos字段的确切含义各不相同,但它通常包含用户的真实姓名(与登录名相反)和与用户相关的其他信息。然而,请注意,在许多系统中,用户可以更改此信息,因此它不可信,因此$gcos受到了污染(请参阅秘鲁石油公司). 出于同样的原因,用户的加密密码和登录shell$passwd和$shell也受到了污染。
在标量上下文中,您可以获得名称,除非函数是按名称查找的,在这种情况下,您可以获取其他内容,无论它是什么。(如果条目不存在,则会获得未定义的值。)例如:
$uid=getpwnam($name);$名称=getpwuid($num);$名称=getpwent();$gid=getgrnam($name);$名称=getgrgid($num);$名称=getgrent();#等。
在获取密码*()字段$quota、$comment和$expire是特殊的,因为它们在许多系统上不受支持。如果$quota不受支持,则它是空标量。如果支持,它通常会对磁盘配额进行编码。如果$comment字段不受支持,则它是一个空标量。如果支持,它通常会对用户的一些管理注释进行编码。在某些系统中,$quota字段可能是$change或$age,这些字段与密码老化有关。在某些系统中,$comment字段可能是$class。$expire字段(如果存在)对帐户或密码的有效期进行编码。有关这些字段在您的系统中的可用性和确切含义,请咨询getpwnam(3)和您的系统密码。小时文件。您还可以通过使用配置
模块和值d_pw配额
,d_页面
,d_pw更改
,d_pw注释
、和d_pweire(_P)到期
只有当您的供应商以直观的方式实现了卷影密码文件,即当您在特权下运行或存在System V(包括Solaris和Linux)中的卷影(3)函数时,调用常规C库例程会获得卷影版本,才支持卷影密码文件。不太可能支持那些实现专用影子密码功能的系统。
返回的$members值获取gr*()是以空格分隔的组成员登录名列表。
对于获取主机*()函数,如果h错误号
变量在C中受支持,它将通过返回给您$?
如果函数调用失败。这个@地址
成功调用返回的值是相应库调用返回的原始地址列表。在Internet域中,每个地址都是四个字节长;你可以这样说:
($a,$b,$c,$d)=解包('W4',$addr[0]);
Socket库使这一点稍微容易:
使用Socket;$iaddr=inet_aton(“127.1”);#或其他地址$名称=gethostbyaddr($iaddr,AF_INET);#或者走另一条路$straddr=inet_ntoa($iaddr);
相反,要将主机名解析为IP地址,可以这样写:
使用Socket;$packed_ip=获取主机名(“www.perl.org”);if(定义$packed\ip){$ip_address=inet_ntoa($packed_ip);}
确保在SCALAR上下文中调用<gethostbyname()>,并检查其返回值的定义。
如果您厌倦了记住返回列表中的哪个元素包含哪个返回值,则在标准模块中提供了按名称命名的接口:文件::stat
,Net::招待
,网络::netent
,网络::协议
,网络::servent
,时间::gmtime
,时间::当地时间
、和用户::grent
。它们覆盖了普通的内置程序,提供了为每个字段返回具有适当名称的对象的版本。例如:
使用文件::stat;使用用户::pwent;$is_his=(stat($filename)->uid==pwent($wherever)->uid);
尽管看起来它们是相同的方法调用(uid),但实际上不是,因为文件::stat
对象不同于用户::pwent
对象。