Perl(良好实践):套接字的词法文件句柄

7
Socket页面中,他们使用全局文件句柄来处理套接字。但是,如果我在由子进程调用的子例程中创建套接字,是否最好仍然使用词法文件句柄并继续使用Socket?
就像这样:
use strict;
use Socket;
sub sendData
{
    my $proto = getprotobyname('tcp');
    my $socket;
    socket($socket, PF_INET, SOCK_STREAM, $proto);
    ...
    close($socket)
}

而不是:

sub sendData
{
    my $proto = getprotobyname('tcp');
    socket(SOCKET, PF_INET, SOCK_STREAM, $proto);
    ...
    close(SOCKET)
}

似乎没问题,但我不知道它是更好的实践还是完全没有用处...谢谢。

2
实际上,在最近版本的 Socket 中已经修复了这个问题。 - Leon Timmermans
3个回答

10

是的,使用词法文件句柄是更好的实践方法。但是,在Perl 5.0之前没有它们,所以有许多旧代码和文档使用全局文件句柄,并且其中很多内容还没有更新为使用词法文件句柄。

P.S. 你知道你可以这样说

socket(my $socket, PF_INET, SOCK_STREAM, $proto);

那么,是不是应该把my放在前一行呢?


我非常希望人们停止错误地将“词法文件句柄”这个术语应用于他们真正的意思,即“自动创建的文件句柄”。 - tchrist

1

是的,使用词法作用域比全局作用域更好。如果您需要唯一的句柄,尽管使用全局作用域,可以尝试符号包


是的,这是来自文档的内容。你在一个全局句柄中处理它。 - tuxuday
Symbol::gensym 创建一个匿名的全局变量并返回其引用。这样的全局变量引用可以用作文件或目录句柄。但是,使用代码“my $socket”,并在socket()或open()中使用它作为文件时,Perl也会创建一个匿名的词法文件句柄,不是吗? - user1334149
是的,open和socket会自动创建文件句柄。 - Leon Timmermans

1

Socket 模块在需要对套接字进行低级调整时非常有用,但对于大多数使用情况,如果不是几乎所有使用情况,IO::Socket::INET 模块提供了更简单的接口。它的构造函数将套接字的句柄作为对象返回,避免了担心全局文件句柄的需要。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接