ref($ variable)何时返回'IO'?

时间:2010-06-02 06:20:26

标签: perl filehandle

以下是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'

2 个答案:

答案 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

并且这不应该在生产代码中真正使用,因为该死的从参考中移除了祝福......