【问题标题】:What is a built-in name for a filehandle in Perl?Perl 中文件句柄的内置名称是什么?
【发布时间】:2016-11-27 19:50:32
【问题描述】:

perl -f ref 列出的名称似乎都不是文件句柄。以下代码返回 GLOB,因此文件句柄似乎在内部映射到或作为 typeglob 管理。对吗?

open FH, '>', "out.txt";
my $ref = \*FH;
print "ref \$ref:", ref $ref, "\n";

文件句柄有自己的类型名称吗?

【问题讨论】:

    标签: perl filehandle


    【解决方案1】:

    文件句柄有自己的类型名称吗?

    IO.

    $ perl -MDevel::Peek -e'Dump(*STDOUT{IO});'
    SV = IV(0x3ba7118) at 0x3ba7128
      REFCNT = 1
      FLAGS = (TEMP,ROK)
      RV = 0x3bc4390
      SV = PVIO(0x3bc8668) at 0x3bc4390
        REFCNT = 3
        FLAGS = (OBJECT)
        STASH = 0x3bc3fa0   "IO::File"
        IFP = 0x3bbe180
        OFP = 0x3bbe180
        DIRP = 0x0
        LINES = 0
        PAGE = 0
        PAGE_LEN = 60
        LINES_LEFT = 0
        TOP_GV = 0x0
        FMT_GV = 0x0
        BOTTOM_GV = 0x0
        TYPE = '>'
        FLAGS = 0x0
    

    从技术上讲,IO 对象可以有三个与之关联的句柄:输入文件句柄 (IFP)、输出文件句柄 (OFP) 和目录句柄(例如,使用 opendir 创建的, DIRP)。通常,只设置输入和输出句柄之一,或者它们都设置为相同的句柄。由于文件和目录句柄是分开的,所以 open(FOO, ...); opendir(FOO, ...); <FOO>; readdir(FOO); 可以正常工作。

    似乎文件句柄在内部被映射到或作为 typeglob 管理。对吗?

    文件和目录 IO 对象通常都封装在一个 glob 中,是的。 但这不是必需的。

    $ perl -E'
       my $fh = "STDOUT";     say($fh "$fh");
       my $fh = *STDOUT;      say($fh "$fh");
       my $fh = \*STDOUT;     say($fh "$fh");
       my $fh = *STDOUT{IO};  say($fh "$fh");
    '
    STDOUT                    # Name
    *main::STDOUT             # Glob
    GLOB(0x1175a48)           # Reference to a glob. (This is returned by open $fh)
    IO::File=IO(0x1175a60)    # Reference to a (blessed) IO.
    

    【讨论】:

    • 如何在同一个 IO 对象中拥有不同的输入/输出句柄?
    • 一个用于输入(读取),一个用于输出(写入)。我不知道它们是否可以不同,除非其中一个为空。
    • 如何让其中一个为空?
    • open my $fh, "<", ...
    • 或者更确切地说,这使得其中一个不为空:)
    猜你喜欢
    • 2013-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-17
    相关资源
    最近更新 更多