代码之家  ›  专栏  ›  技术社区  ›  Zaid

Ref($variable)何时返回“io”?

  •  4
  • Zaid  · 技术社区  · 16 年前

    以下是 ref 功能:

    返回的值取决于引用所引用的对象的类型。内置类型包括:

    SCALAR
    ARRAY
    HASH
    CODE
    REF
    GLOB
    LVALUE
    FORMAT
    IO
    VSTRING
    Regexp
    

    基于此,我想象着 裁判 在文件句柄上返回 'IO' . 令人惊讶的是,它没有:

    use strict;
    use warnings;
    
    open my $fileHandle, '<', 'aValidFile';
    close $fileHandle;
    
    print ref $fileHandle;     # prints 'GLOB', not 'IO'
    

    perlref 试图解释原因:

    不可能创造一个真正的 对IO句柄(filehandle)的引用 或dirhandle)使用反斜杠 操作员。你能得到的最多的是 对typeglob的引用,即 实际上是一个完整的符号表 但是,您仍然可以 使用类型globs和globrefs 好像是IO手柄。


    在什么情况下 裁判 返回 “IO” 那么呢?

    2 回复  |  直到 16 年前
        1
  •  4
  •   ysth    16 年前

    获取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部分)

        2
  •  2
  •   Community Mohan Dere    9 年前

    正如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
    

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