以下是ref
函数文档中的相关摘录:
返回的值取决于引用所引用的事物的类型。内置类型包括:
SCALAR ARRAY HASH CODE REF GLOB LVALUE FORMAT IO VSTRING Regexp
基于此,我想象在文件句柄上调用ref
将返回'IO'
。令人惊讶的是,它没有:
use strict;
use warnings;
open my $fileHandle, '<', 'aValidFile';
close $fileHandle;
print ref $fileHandle; # prints 'GLOB', not 'IO'
perlref
试图解释原因:
无法创建真实的 引用IO句柄(文件句柄 或者dirhandle)使用反斜杠 运营商。你能获得的最多是一个 引用一个typeglob,即 实际上是一个完整的符号表 进入[...]但是,你仍然可以 使用类型globs和globrefs 好像它们是IO句柄。
ref
会在什么情况下返回'IO'
?
答案 0 :(得分:4)
获取IO引用的唯一方法是使用* FOO {THING}语法:
$ioref = *glob{IO};
其中glob是一个像STDIN这样的命名glob或者像$ fh这样的引用。但是一旦你有了 这样的引用,它可以像任何其他标量一样传递或存储在任意数据结构中,因此编组模块之类的东西需要精通它。
由于glob或globref可以用作文件句柄并隐式获取包含的IO,因此不需要IO引用。主要的例外是:
use Symbol;
# replace *FOO{IO} handle but not $FOO, %FOO, etc.
*FOO = geniosym;
(geniosym返回一个新的半匿名IO引用,并且任何非glob引用-glob赋值仅分配给该特定引用的glob部分)
答案 1 :(得分:2)
正如Konerak所说,答案就是这个问题:
How can I get Perl's ref() function to return REF, IO, and LVALUE?
相关摘录如下:
use Acme::Damn;
say 'IO: ', ref damn *STDIN{IO}; # really prints IO
并且这不应该在生产代码中真正使用,因为该死的从参考中移除了祝福......