2014-07-21 93 views
0

我正在研究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; 

尤其是我指的星號標記法... $襪子是一個對象,據我理解,但是這是什麼東西:$ {* $襪子}?這個星號運算符是如何調用的?它的目的是什麼?

如果有人能讓我看到一些實用的簡約例子,我將不勝感激。

回答

2

總之:因爲文件句柄(在這種情況下是套接字文件句柄)是GLOB引用而不是HASH引用。你不能簡單地

$sock->{field} 

因爲這將只有$襪子是HASH參考工作。相反,對於基於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

IO::Handle(因此IO::SocketIO::File,等等)返回一個從它的構造,祝福typeglob參考。這允許對象本身被用作一個文件句柄,如:

use IO::File; 

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

IO::Socket,福地類型團還持有的散列。 ${*$sock}{'io_socket_domain'}取消引用typeglob(就像@$arrayref將取消引用數組引用),然後訪問此散列。