'*{}';似乎是有效的Perl5解引用运算符(perldoc:重载)。它与什么无关?

'*{}';似乎是有效的Perl5解引用运算符(perldoc:重载)。它与什么无关?,perl,operator-overloading,pragma,dereference,Perl,Operator Overloading,Pragma,Dereference,当我读到Perl5的pragma重载时,我注意到了操作员 我想知道*是什么类型的符号,如果有的话,或者*在ref上下文中是什么意思。它指的是一个符号。它可以引用任何类型。它们现在大多是遗留下来的。foo是一个“typeglob”,简称“glob”。glob是一种结构(如Cstruct),其中包含名为ARRAY、HASH、IO等字段。这些字段要么不包含任何内容,要么包含引用。从Perl代码的角度来看,它们看起来像非常特殊的散列 globs的主要用途是作为Perl符号表的条目提供服务器。符号表包含属

当我读到Perl5的pragma重载时,我注意到了操作员

我想知道
*
是什么类型的符号,如果有的话,或者
*
在ref上下文中是什么意思。

它指的是一个符号。它可以引用任何类型。它们现在大多是遗留下来的。foo是一个“typeglob”,简称“glob”。glob是一种结构(如C
struct
),其中包含名为
ARRAY
HASH
IO
等字段。这些字段要么不包含任何内容,要么包含引用。从Perl代码的角度来看,它们看起来像非常特殊的散列

globs的主要用途是作为Perl符号表的条目提供服务器。符号表包含属于包的所有符号和所有“真正全局”变量(例如
STDOUT
$1
,等等)。没有符号,就没有命名的子例程,
@ISA
@EXPORT
就不存在,
@
$
等也不存在。[显然,glob绝对不是遗留的。]

$ perl -E'
    our @foo = qw( a b c );
    our %foo = ( d=>4, e=>5 );
    say @{ *foo{ARRAY} };
    say %{ *foo{HASH} };
'
abc
d4e5
glob还用作IO对象(文件句柄)的包装器。即使是
open(my$fh,…)
也会用glob填充
$fh

glob很少在Perl中显式使用。一个例外是旧式文件句柄。例如,
FILE
STDOUT
实际上意味着
*FILE
*STDOUT
(当用作文件句柄时),它们在术语上用于获取
*FILE{IO}
*STDOUT{IO}

$ perl -e'open(FILE, "echo foo|") or die; print readline(FILE);'
foo

$ perl -e'open(*FILE, "echo foo|") or die; print readline(*FILE);'
foo

$ perl -e'open(*FILE{IO}, "echo foo|") or die; print readline(*FILE{IO});'
foo
那么为什么要覆盖
*{}


如果要创建一个看起来像文件句柄而实际上不是文件句柄的对象,则需要重写
*{}
。例如,您可以使用此覆盖来创建基于IO::Socket对象哈希的对象,而不是基于glob的对象。

不是遗留对象
IO::Socket
及其子类使用typeglobs存储关于每个sockethandle的配置。“Typeglob”(简称“glob”)是Perl对“符号表条目”的名称。符号表包含属于包的所有符号和所有“真正全局”变量(例如
$1
)。没有符号,就不会有命名的子例程,
@ISA
@EXPORT
就不存在,
$\u
@
$
,等等。glob肯定不是遗留的。Globs还用于包装IO对象(文件句柄),包括词法文件句柄,但这可能是由于旧的原因,因为IO对象现在是一级对象。@mob,虽然Globs不是旧的,但您的注释不是反对Globs是旧的有效参数。IO::Socket使用globs的唯一原因是因为IO对象被包装在其中,而这可能是因为遗留原因,所以IO::Socket之所以这样做可能是因为遗留原因。我使用了
IO::Socket
及其类似的示例。另请参阅: