我正在调查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}?这个星号运算符是如何调用的?它的目的是什么?
如果有人能让我看到一些实用的简约例子,我将不胜感激。
答案 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::Socket
,IO::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
取消引用数组引用一样)然后访问此哈希值。