内容

名称

Net::servent - 通过名称访问 Perl 内置 getserv*() 函数

概要

use Net::servent;
my $s = getservbyname(shift || 'ftp') || die "no service";
printf "port for %s is %s, aliases are %s\n",
   $s->name, $s->port, "@{$s->aliases}";

use Net::servent qw(:FIELDS);
getservbyname(shift || 'ftp') || die "no service";
print "port for $s_name is $s_port, aliases are @s_aliases\n";

描述

此模块的默认导出覆盖了核心函数 getservent()、getservbyname() 和 getnetbyport(),用返回“Net::servent”对象的版本替换它们。它们默认使用“tcp”作为第二个参数。此对象具有方法,可以从 netdb.h 中的 C 的 servent 结构返回同名结构字段名称;即 name、aliases、port 和 proto。aliases 方法返回一个数组引用,其余返回标量。

您还可以使用 :FIELDS 导入标签将所有结构字段直接导入到您的命名空间中作为常规变量。(请注意,这仍然会覆盖您的核心函数。)将这些字段作为以 s_ 开头的变量访问。因此,$serv_obj->name() 对应于 $s_name(如果您导入了这些字段)。数组引用作为常规数组变量可用,因此例如 @{ $serv_obj->aliases()} 将只是 @s_aliases。

getserv() 函数是一个简单的前端,它将数字参数转发给 getservbyport(),并将其余参数转发给 getservbyname()。

要访问此功能而不覆盖核心函数,请使用空导入列表传递 use,然后使用其完全限定名称访问函数。另一方面,内置函数仍然可以通过 CORE:: 伪包访问。

示例

use Net::servent qw(:FIELDS);

while (@ARGV) {
    my ($service, $proto) = ((split m!/!, shift), 'tcp');
    my $valet = getserv($service, $proto);
    unless ($valet) {
        warn "$0: No service: $service/$proto\n"
        next;
    }
    printf "service $service/$proto is port %d\n", $valet->port;
    print "alias are @s_aliases\n" if @s_aliases;
}

注意

虽然此类目前使用 Class::Struct 模块来构建类似结构的类,但您不应该依赖于此。

作者

Tom Christiansen