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 結構中同名的結構欄位名稱;即名稱、別名、埠和通訊協定。別名方法傳回陣列參考,其餘為純量。
您也可以使用 :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