ref()的文档提到了几个可能的返回值.我理解他们中的大部分,但不是REF,IO和LVALUE.我如何编写Perl代码以使ref返回这些值?
在阅读了typeglobs and file handles的文档之后,我使用以下代码关闭了IO:
open(INPUT,'<','foo.pl'); print ref(*INPUT{IO}),"\n"; # Prints IO::Handle@H_502_5@对于REF和LVALUE,我尝试了几个奇怪的结构,但没有成功.
解决方法
这是制作大部分内容的快捷方式:
use 5.010; say 'SCALAR: ',ref \undef; say 'ARRAY: ',ref [1..5]; say 'HASH: ',ref { key => 'value' }; say 'CODE: ',ref sub {}; say 'REF: ',ref \\undef; say 'GLOB: ',ref \*_; say 'LVALUE: ',ref \substr "abc",1,2; say 'LVALUE: ',ref \vec 42,2; say 'FORMAT: ',ref *STDOUT{FORMAT}; # needs declaration below say 'IO: ',ref *STDIN{IO}; # actually prints IO::Handle say 'VSTRING: ',ref \v5.10.0; say 'Regexp: ',ref qr/./; format = .@H_502_5@REF只是对另一个参考的引用. LVALUE是标量的一种特殊情况,如果它被修改则会产生外部影响.
IO是句柄背后的基本类型,你可以使用Acme::Damn from CPAN使它显得明显.正如Michael Carman在评论中所指出的,你真的不应该是不兼容的对象 – 不要在实际代码中使用.
use Acme::Damn; say 'IO: ',ref damn *STDIN{IO}; # really prints IO@H_502_5@ref函数的源代码也有一些显示“BIND”和“UNKNOWN”的代码,但是不应该有办法让那些没有搞乱内部的东西. Blead还有一个有趣的“REGEXP”(不同于上面的“Regexp”);如果有人知道如何让ref产生…