这是文档的相关摘录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 的引用,即
实际上是一个完整的符号表
条目 [...]但是,您仍然可以
使用类型 glob 和 globrefs
就像它们是 IO 句柄一样。
什么情况下会ref
return 'IO'
then?
获取 IO 引用的唯一方法是使用 *FOO{THING} 语法:
$ioref = *glob{IO};
其中 glob 是一个命名的 glob(如 STDIN)或一个引用(如 $fh)。但一旦你有了
这样一个引用,它可以像任何其他标量一样传递或存储在任意数据结构中,因此像编组模块这样的事情需要精通它。
由于 glob 或 globref 可以用作文件句柄并隐式获取包含的 IO 事物,因此不需要太多 IO 引用。主要的例外是:
use Symbol;
# replace *FOO{IO} handle but not $FOO, %FOO, etc.
*FOO = geniosym;
(geniosym 返回一个新的半匿名 IO 引用,任何非 glob 引用到 glob 的分配仅分配给该特定引用的 glob 部分)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)