加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

‘* {}’似乎是一个有效的Perl5解除引用运算符(perldoc:overloa

发布时间:2020-12-16 06:18:36 所属栏目:大数据 来源:网络整理
导读:在阅读关于Perl5的pragma重载时,我注意到了运算符 *{} . 我想知道什么样的sigil *,如果有的话,或者在ref上下文中*的含义是什么. 解决方法 * foo是一个“typeglob”,或简称为“glob”. glob是一个结构(如在C结构中),其字段名为ARRAY,HASH,IO等.这些字段不包含
在阅读关于Perl5的pragma重载时,我注意到了运算符 *{}.

我想知道什么样的sigil *,如果有的话,或者在ref上下文中*的含义是什么.

解决方法

* foo是一个“typeglob”,或简称为“glob”. glob是一个结构(如在C结构中),其字段名为ARRAY,HASH,IO等.这些字段不包含任何内容或引用.从Perl代码的角度来看,它们看起来非常特殊.

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

$perl -E'
    our @foo = qw( a b c );
    our %foo = ( d=>4,e=>5 );
    say @{ *foo{ARRAY} };
    say %{ *foo{HASH} };
'
abc
d4e5

Globs还用作IO对象(文件句柄)的包装器.即使打开(我的$fh,…)用glob填充$fh.

在Perl中很少使用Globs.旧的文件句柄是一个例外.例如,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的对象.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读