如何让Perl的ref()函数返回REF,IO和LVALUE?

FMc*_*FMc 4 perl types

ref()的文档提到了几个可能的返回值.我明白了其中大部分,但不是REF,IOLVALUE.我如何编写Perl代码ref以返回这些值?

在阅读了关于typeglobs和文件句柄的文档后,我接近了IO这段代码:

open(INPUT, '<', 'foo.pl');
print ref(*INPUT{IO}), "\n";  # Prints IO::Handle
Run Code Online (Sandbox Code Playgroud)

因为REFLVALUE我尝试了几个奇怪的结构,但没有成功.

JB.*_*JB. 15

这是制作大部分内容的快捷方式:

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, 1, 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 =
.
Run Code Online (Sandbox Code Playgroud)

REF只是对另一个参考的参考.LVALUE是标量的一种特殊情况,如果它被修改则会产生外部影响.

IO是句柄背后的基本类型,您可以使用CPAN中的Acme :: Damn使其显式显示.正如Michael Carman在评论中指出的那样,你真的不应该是不兼容的对象 - 不要在实际代码中使用.

use Acme::Damn;
say 'IO:      ', ref damn *STDIN{IO}; # really prints IO
Run Code Online (Sandbox Code Playgroud)

ref函数的源代码还有一些显示"BIND"和"UNKNOWN"的代码,但是不应该有一种方法来获取那些没有搞乱内部的东西.Blead还有一个有趣的"REGEXP"(不同于上面的"Regexp"); 如果有人知道如何让ref收益...

  • 正如"该死的"这个名字一样令人愉快,你不太可能想要取消祝福.使用`Scalar :: Util :: reftype()`来查看基础引用类型的`bless`. (2认同)