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