【问题标题】:When does ref($variable) return 'IO'?ref($variable) 什么时候返回 'IO'?
【发布时间】:2010-06-02 06:20:26
【问题描述】:

这是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会在什么情况下返回'IO'呢?

【问题讨论】:

标签: perl filehandle


【解决方案1】:

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

$ioref = *glob{IO};

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

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

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

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

【讨论】:

    【解决方案2】:

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

    How can I get Perl's ref() function to return REF, IO, and LVALUE?

    相关的sn-p是:

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

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

    【讨论】:

    • 嗯...这是ref 会返回'IO' 的唯一实例吗?
    猜你喜欢
    • 2018-04-30
    • 1970-01-01
    • 1970-01-01
    • 2014-10-25
    • 2014-11-04
    • 1970-01-01
    • 1970-01-01
    • 2019-09-04
    • 2021-10-11
    相关资源
    最近更新 更多