2012-03-20 7 views
4

Net::SSLはCrypt :: SSLeayの一部です。今日のバグ報告に取り組んでいるうちに、貧しい人々の何度も何度も気を散らしました。*が出ました。例えばなぜNet :: SSLの逆参照タイプのコードが必要なのですか?

Net::SSL::configureを考える:私は事前5.8 Perlでその慣れていないですので

*$self->{ssl_version} = $ssl_version; 
*$self->{ssl_debug} = $ssl_debug; 
*$self->{ssl_arg} = $arg; 
*$self->{ssl_peer_addr} = $arg->{PeerAddr}; 
*$self->{ssl_peer_port} = $arg->{PeerPort}; 

は、多分それはだが、私はちょうどLHSに*を使用するための重要な理由があるかどうかを正確に特定することはできません。 *$self->{ssl_peer_port} = $arg->{PeerPort};で十分ではないでしょうか?または、ここで何か深刻なことがありますか(たとえばlocal $_local *_)?

答えて

2

私はモジュールがインストールされていないので、簡単に十分にチェックすることはできませんが、オブジェクトがglobrefであるためです。つまり、祝福された型グロブへの参照です。

ここではエイリアシングはありません。あなたが書くとき

*$self->{ssl_debug} = $ssl_debug; 

まず、globrefを完全な型グロブに戻します。次に、型グロブのハッシュリファレンスの部分を取得し、逆参照することに進みます。

これは5.8以前のものではありません。

あなたはそれが何をしていると思い込んでいましたか?

+0

私は混乱して、 '$ self - > {ssl_debug}'が型グロブとして扱われていると思いました。答えをありがとう。私が前に5.6を持ってきたのは、私が知らないものが分からないからです;-) –

+1

@SinanÜnür接頭辞逆参照が先行するものよりも前にある優先順位の問題と考えてください。あるいは、 ' - >'をその左辺の周りに '$ {...} 'を置くように考えてください。 C言語で '* argv [0]'を読むとき、本当に '*(argv [0])'であるがPerlでは '$$ aref [0]'は '$ {$ aref} [0]'ではない '$ {$ aref [0]} '。 '*'を含む他のプレフィックスデレッファも最初に出ます。だから、あなたの表現は '$ {* $ self} {ssl_debug}'でした。おそらくあなたが野生でそれにチャレンジしたなら、状況を悪化させたかもしれません。 :) – tchrist

1

tchristは(いつものように)正しいトラックにあります。あなたはIO::Socketで遊んで、祝福されたタイプグロブへの参照で何ができるかできないかを見てください。

use IO::Socket; 
$foo = IO::Socket->new; 

print $foo;      # IO::Socket=GLOB(0x20467b18) 
print *$foo;      # *Symbol::GEN0 
print ref($foo);     # IO::Socket 
print ref(*$foo);    # "" 

*$foo->{key} = value;   # ok 
$$foo->{key} = value;   # ok 
$foo->{key} = value;    # Not a HASH reference at ... 
関連する問題