perl(良好实践):socket的词法文件句柄

时间:2012-05-09 09:40:30

标签: perl sockets

在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)
}

似乎没问题,但我不知道这是一种更好的做法还是完全没用......

由于

3 个答案:

答案 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模块提供了一个更简单的接口。它的构造函数将套接字句柄作为对象返回,从而无需担心全局文件句柄。