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

前端之家收集整理的这篇文章主要介绍了如何让Perl的ref()函数返回REF,IO和LVALUE?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
ref()的文档提到了几个可能的返回值.我理解他们中的大部分,但不是REF,IO和LVALUE.我如何编写Perl代码以使ref返回这些值?

在阅读了typeglobs and file handles的文档之后,我使用以下代码关闭了IO:

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

对于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 =
.

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

IO是句柄背后的基本类型,你可以使用Acme::Damn from CPAN使它显得明显.正如Michael Carman在评论中所指出的,你真的不应该是不兼容的对象 – 不要在实际代码中使用.

use Acme::Damn;
say 'IO:      ',ref damn *STDIN{IO}; # really prints IO

ref函数的源代码也有一些显示“BIND”和“UNKNOWN”的代码,但是不应该有办法让那些没有搞乱内部的东西. Blead还有一个有趣的“REGEXP”(不同于上面的“Regexp”);如果有人知道如何让ref产生…

猜你在找的Perl相关文章