Почему код в Net :: SSL разыменовывает блоки типов, когда я не вижу необходимости? - PullRequest
4 голосов
/ 21 марта 2012

Net::SSL является частью Crypt :: SSLeay. Работая сегодня над сообщением об ошибке, я был отвлечен тем, сколько раз появлялся бедный старый *.

Например, рассмотрим Net::SSL::configure:

*$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};

Возможно, это потому, что я не очень хорошо знаком с pre 5.8 Perl, но я просто не могу точно определить, есть ли существенная причина для использования * на LHS. Разве просто *$self->{ssl_peer_port} = $arg->{PeerPort}; не будет достаточно? Или здесь что-то происходит глубоко (например, local $_ против local *_)?

Ответы [ 2 ]

2 голосов
/ 21 марта 2012

У меня не установлен модуль, поэтому я не могу проверить достаточно легко, но я предполагаю, что это потому, что объект является глобальным;то есть ссылка на благословенный тип.

Здесь нет псевдонимов.Когда вы пишете

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

, сначала происходит разыменование globref до полного типа typeglob.Затем он захватывает только аспект hashref typeglob и переходит к разыменованию этого.

Это не до или после 5.8 вещь.

Что вы думали, что делал

1 голос
/ 21 марта 2012

Чрист (как всегда) на правильном пути. Вы можете поиграть с 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 ...
...