‘* {}’似乎是一个有效的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的对象. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |