"$ var =*$ self - > {class_var};"是什么意思

Tre*_*ton 10 perl

我试图寻找这个,但没有提出任何建议.

我只是好奇为什么会把星号放在下面的场景中:

$var = *$self->{class_var};
Run Code Online (Sandbox Code Playgroud)

*在这种情况下做什么?

更新

我从Net :: Telnet模块中获取了上述内容,我只是想了解它.

实际代码是:

$s = *$self->{net_telnet};
Run Code Online (Sandbox Code Playgroud)

我想知道net_telnet的包名是什么?

Eri*_*rom 8

%main::some_hash = (class_var => 'xyz');

my $self = *main::some_hash;

print *$self->{class_var}, "\n";   # prints 'xyz'
Run Code Online (Sandbox Code Playgroud)

简而言之,这是一种过时的方式来传递对符号表中的哈希的引用.在*之前$self取消引用的值$self作为一个类型团.在->{class_var}随后解引用类型团作为一个哈希,并查找class_var键.

更新:

通过类层次结构向下挖掘,可以看出正在创建对象IO::Handle:

sub new {
    my $class = ref($_[0]) || $_[0] || "IO::Handle";
    @_ == 1 or croak "usage: new $class";
    my $io = gensym;
    bless $io, $class;
}
Run Code Online (Sandbox Code Playgroud)

Symbol::gensym返回一个完整的typeglob,IO主要使用slot.但是,由于它是一个完整的类型,子模块正在利用这一事实并将其数据存储在各种其他的glob字段中,即该HASH部分.

  • +1很好的解释.Perldata还提到了这一点:`这曾经是通过引用将数组和哈希值传递给函数的首选方法,但是现在我们有了真正的引用,这很少需要. (2认同)

Ven*_*tsu 6

从你所拥有的一小段代码我假设$self持有一个typeglob.您可以像eugene提到的那样显式地访问子元素,或者通过在typeglob上使用任何标准的解引用语法来隐式地访问子元素.

#!/usr/bin/perl

use strict;
use warnings;

our %test = ( class_var => "test class_var" );
our @test = qw(one four nine);

my $self = \*test;
print "Self is '$self'\n";

my $var1 = *{$self}{HASH}{class_var};
print "Var1 is '$var1'\n";

my $var2 = *$self->{class_var};
print "Var2 is '$var2'\n";

my $var3 = ${*{$self}}{class_var};
print "Var3 is '$var3'\n";

my $var4 = ${*$self}{class_var};
print "Var4 is '$var4'\n";

my $x_scale = *$self{ARRAY}[0];
print "x_scale is '$x_scale'\n";

my $y_scale = *$self->[1];
print "y_scale is '$y_scale'\n";

my $z_scale = ${*$self}[2];
print "z_scale is '$z_scale'\n";
Run Code Online (Sandbox Code Playgroud)

Typeglob引用(符号别名之外)最常用于IO槽,它允许将对象用作文件句柄,但由于typeglob包含每种类型的变量之一,因此其他变量槽可用于存储其他状态数据.

typeglob不必是全局的,Symbol::gensym可以创建一个基本上是匿名的typeglob.