在perdoc Socket页面中,他们使用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)
}
似乎没问题,但我不知道这是一种更好的做法还是完全没用......
由于
答案 0 :(得分:10)
是的,使用词法文件句柄是一种更好的做法。但是Perl 5.0没有它们,所以有很多旧的代码和文档使用全局文件句柄,其中大部分尚未更新为使用词法句柄。
P.S。你知道你可以说
socket(my $socket, PF_INET, SOCK_STREAM, $proto);
而不是将my
放在上一行,对吗?
答案 1 :(得分:1)
是的,最好使用词法范围而不是全局范围。如果您需要唯一的句柄,尽管是全局的,请尝试Symbol package
答案 2 :(得分:1)
Socket
模块非常有用,如果您需要对套接字的配置进行一些低级调整,但对于大多数用途,如果不是几乎所有用途,IO::Socket::INET
模块提供了一个更简单的接口。它的构造函数将套接字句柄作为对象返回,从而无需担心全局文件句柄。