问题描述
Here's the relevant excerpt from the documentation of the ref
function:
返回的值取决于引用所引用的事物的类型.内置类型包括:
SCALAR
ARRAY
HASH
CODE
REF
GLOB
LVALUE
FORMAT
IO
VSTRING
Regexp
基于此,我想象在文件句柄上调用 ref
会返回 'IO'
.令人惊讶的是,它没有:
Based on this, I imagined that calling ref
on a filehandle would return 'IO'
. Surprisingly, it doesn't:
use strict;
use warnings;
open my $fileHandle, '<', 'aValidFile';
close $fileHandle;
print ref $fileHandle; # prints 'GLOB', not 'IO'
perlref
试图解释原因:
perlref
tries to explain why:
不可能创建一个真正的对 IO 句柄的引用(文件句柄或 dirhandle) 使用反斜杠操作员.你最多能得到一个对 typeglob 的引用,即实际上是一个完整的符号表进入 [...] 但是,您仍然可以使用类型 globs 和 globrefs好像它们是 IO 句柄.
在什么情况下ref
会返回'IO'
?
推荐答案
获取 IO 引用的唯一方法是使用 *FOO{THING} 语法:
The only way to get an IO reference is to use the *FOO{THING} syntax:
$ioref = *glob{IO};
其中 glob 是像 STDIN 这样的命名 glob 或像 $fh 这样的引用.但是一旦你有了这样一个引用,它可以像任何其他标量一样被传递或存储在任意数据结构中,所以像编组模块这样的事情需要精通它.
where glob is a named glob like STDIN or a reference like $fh. But once you havesuch a reference, it can be passed around or stored in arbitrary data structures just like any other scalar, so things like marshalling modules need to be savvy of it.
由于 glob 或 globref 可以用作文件句柄并隐式获取包含的 IO 事物,因此不需要很多 IO 引用.主要的例外是:
Since a glob or globref can be used as a filehandle and implicitly get the contained IO thingy, there isn't a lot of need for IO refs. The main exception is this:
use Symbol;
# replace *FOO{IO} handle but not $FOO, %FOO, etc.
*FOO = geniosym;
(geniosym 返回一个新的半匿名 IO 引用,任何非 glob 引用到 glob 的赋值只分配给该特定引用的 glob 部分)
(geniosym returns a new semi-anonymous IO reference, and any non-glob reference-to-glob assignment only assigns to that particular reference's part of the glob)
这篇关于ref($variable) 什么时候返回 'IO'?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!