4

以下是函数文档的相关摘录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 句柄(文件句柄或目录句柄)的真实引用。您最多可以获得对 typeglob 的引用,它实际上是一个完整的符号表条目 [...] 但是,您仍然可以使用 type glob 和 globrefs,就好像它们是 IO 句柄一样。


在什么情况下会ref返回'IO'呢?

4

2 回答 2

4

获取 IO 引用的唯一方法是使用 *FOO{THING} 语法:

$ioref = *glob{IO};

其中 glob 是像 STDIN 这样的命名 glob 或像 $fh 这样的引用。但是一旦你有了这样的引用,它就可以像任何其他标量一样被传递或存储在任意数据结构中,所以像编组模块这样的东西需要精通它。

由于 glob 或 globref 可以用作文件句柄并隐式获取包含的 IO 事物,因此对 IO refs 的需求并不多。主要的例外是:

use Symbol;
# replace *FOO{IO} handle but not $FOO, %FOO, etc.
*FOO = geniosym;

(geniosym 返回一个新的半匿名 IO 引用,并且任何非 glob 引用到 glob 分配仅分配给该特定引用的 glob 部分)

于 2010-06-02T07:21:40.713 回答
2

正如 Konerak 所说,答案就在这个问题中:

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

相关的片段是:

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

这不应该真正用于生产代码,因为该死的从参考中删除了祝福......

于 2010-06-02T06:47:08.017 回答