我试图寻找这个,但没有提出任何建议.
我只是好奇为什么会把星号放在下面的场景中:
$var = *$self->{class_var};
Run Code Online (Sandbox Code Playgroud)
*在这种情况下做什么?
更新
我从Net :: Telnet模块中获取了上述内容,我只是想了解它.
实际代码是:
$s = *$self->{net_telnet};
Run Code Online (Sandbox Code Playgroud)
我想知道net_telnet的包名是什么?
%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部分.
从你所拥有的一小段代码我假设$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.
| 归档时间: |
|
| 查看次数: |
784 次 |
| 最近记录: |