'*{}';似乎是有效的Perl5解引用运算符(perldoc:重载)。它与什么无关?
当我读到Perl5的pragma重载时,我注意到了操作员 我想知道'*{}';似乎是有效的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符号表的条目提供服务器。符号表包含属
*
是什么类型的符号,如果有的话,或者*
在ref上下文中是什么意思。它指的是一个符号。它可以引用任何类型。它们现在大多是遗留下来的。foo是一个“typeglob”,简称“glob”。glob是一种结构(如Cstruct
),其中包含名为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
及其类似的示例。另请参阅: