4

在阅读 Perl5 的编译指示重载时,我注意到了 operator *{}

我想知道是什么样的印记(如果有的话),或者在参考上下文中*的含义是什么。*

4

2 回答 2

4

它指的是typeglob。它可以引用任何类型。他们现在大多是遗产。

于 2012-04-13T09:58:12.413 回答
3

*foo是“typeglob”,简称“glob”。glob 是一个结构(如在 C 中struct),具有名为ARRAYHASHIO等的字段。这些字段要么不包含任何内容,要么包含引用。从 Perl 代码的角度来看,它们看起来像非常特殊的哈希。

glob 的主要目的是作为 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, ...)填充$fh了一个球体。

Glob 在 Perl 中很少显式使用。一个例外是旧式文件句柄。例如,FILEandSTDOUT实际上表示*FILEand *STDOUT(当用作文件句柄时),它在术语中用于获取*FILE{IO}and *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 的对象。

于 2012-04-13T18:37:43.653 回答