一些语法澄清:$ {* $ sock}

时间:2014-07-21 10:09:27

标签: perl sockets object

我正在调查IO:Socket.pm模块,我第一次看到“* $ sock”符号。

sub socket {
    @_ == 4 or croak 'usage: $sock->socket(DOMAIN, TYPE, PROTOCOL)';
    my($sock,$domain,$type,$protocol) = @_;

    socket($sock,$domain,$type,$protocol) or
        return undef;

    ${*$sock}{'io_socket_domain'} = $domain;
    ${*$sock}{'io_socket_type'}   = $type;
    ${*$sock}{'io_socket_proto'}  = $protocol;

    $sock;
}

以下语法的意图是什么?

${*$sock}{'io_socket_domain'} = $domain;

特别是我指的是星号表示法......就我所知,$ sock是一个对象,但这是什么东西:$ {* $ sock}?这个星号运算符是如何调用的?它的目的是什么?

如果有人能让我看到一些实用的简约例子,我将不胜感激。

2 个答案:

答案 0 :(得分:2)

总结:因为文件句柄(在这种情况下是套接字文件句柄)是GLOB引用而不是HASH引用。你不能简单地

$sock->{field}

因为仅当$ sock是HASH引用时才会起作用。相反,对于基于GLOB的对象,我们使用底层glob的哈希槽作为存储对象实例字段的位置

   $sock       # is a GLOB reference
  *$sock       # is the underlying GLOB
%{*$sock}      # is the hash at the HASH slot of the GLOB
${*$sock}{key} # is a member of the HASH

答案 1 :(得分:1)

IO::Handle(因此IO::SocketIO::File等)从其构造函数返回一个受祝福的typeglob引用。这允许对象本身用作文件句柄,如:

use IO::File;

$fh = IO::File->new();
if ($fh->open("< file")) {
    print <$fh>;
    $fh->close;
}

IO::Socket中,受祝福的typeglob也包含哈希值。 ${*$sock}{'io_socket_domain'}取消引用typeglob(就像@$arrayref取消引用数组引用一样)然后访问此哈希值。