【问题标题】:perl (good practice): lexical filehandle for socketperl(良好实践):套接字的词法文件句柄
【发布时间】:2012-05-10 01:23:06
【问题描述】:

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

似乎还可以,但不知道是更好的做法还是完全没用...

谢谢

【问题讨论】:

标签: perl sockets


【解决方案1】:

是的,使用词法文件句柄是一种更好的做法。但是 Perl 5.0 没有它们,所以有很多使用全局文件句柄的旧代码和文档,其中大部分还没有更新为使用词法句柄。

附:你知道你可以说

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

而不是将my 放在上一行,对吧?

【讨论】:

  • 我非常希望人们不要再将术语“词法文件句柄”误用为他们真正的意思,即“自动激活的文件句柄”。
【解决方案2】:

是的,使用词法范围而不是全局范围总是更好。如果您需要唯一的句柄,尽管是全局的,请尝试Symbol package

【讨论】:

  • 是的,来自文档。你有一个全局句柄。
  • "Symbol::gensym 创建一个匿名 glob 并返回对它的引用。这样的 glob 引用可以用作文件或目录句柄。"好的,但是使用代码“my $socket”,并在 socket() 或 open() 中使用它作为文件,perl 也会创建一个匿名词法文件句柄,不是吗?
  • 是的,打开和套接字自动激活文件句柄
【解决方案3】:

如果您需要对套接字的配置方式进行一些低级调整,Socket 模块很有用,但对于大多数用途(如果不是几乎所有用途),IO::Socket::INET 模块提供了一个更简单的界面。它的构造函数将套接字的句柄作为对象返回,无需担心全局文件句柄。

【讨论】:

    猜你喜欢
    • 2012-12-15
    • 1970-01-01
    • 2017-02-16
    • 2012-10-21
    • 1970-01-01
    • 1970-01-01
    • 2011-11-08
    • 1970-01-01
    • 2012-07-20
    相关资源
    最近更新 更多