【问题标题】:Pointer of a file handle in perlperl中文件句柄的指针
【发布时间】:2017-09-26 23:03:00
【问题描述】:

参考下面几行:

 open(FILE, ">" ,$file )
 FILE->autoflush;
 $self->{FILEH} = *FILE;

想了解最后两行在做什么,第二行将 FILE 所具有的任何内容(直到到达第二行)输出到 $file 表示的文件,然后存储 FILE 的引用(对文件处理程序的引用,由*FILE ) 到一个祝福的哈希键(这里 $self 是一个祝福的哈希引用)。请让我知道我的理解是否正确。 *FILE 可以替换为 \FILE 吗?

【问题讨论】:

    标签: perl


    【解决方案1】:

    ,不能用\FILE代替。

    FILE 有不同的含义。我将尝试逐行解释它们。

    open(FILE, ">" ,$file ); # GLOB file handle
    FILE->autoflush;         # GLOB gets magically converted to an IO::Handle object
    $self->{FILEH} = *FILE;  # accessing the typeglob as a typeglob
    

    这里有三种不同的东西在起作用。

    当您open 文件句柄时,它只是一个 GLOB。本质上,这是一个在你的程序中是全局的文件句柄。

    在下一行中,您调用 GLOB 文件句柄上的方法。 Perl 很聪明,会将文件句柄升级为 IO::Handle 对象,因此它可以为您调用该方法。

    在第三行中,typeglob 被分配给对象的一个​​属性。在这种情况下,typeglob 本身就是一个被分配的东西。但这不是参考。这显示了 typeglob 是多么奇怪,而且这种文件句柄令人困惑,不应该使用。

    但是,如果您这样做 \FILE,它将无法正常工作。看看这个:

    $ perl -E 'say \STDOUT'
    SCALAR(0x2534f58)
    $ perl -E 'use strict; say \STDOUT'
    Bareword "STDOUT" not allowed while "strict subs" in use at -e line 1.
    Execution of -e aborted due to compilation errors.
    

    如果你忽略了*,Perl 认为你的裸词STDOUT 是一个函数调用,但是没有函数STDOUT 存在,所以它会失败。在第一个示例中,没有strict,裸字反而被视为字符串。获取了一个引用,我们看到了一个标量引用。

    如果您想获取 typeglob 的引用,则必须执行 \*FILE

    $ perl -E 'say \*STDOUT'
    GLOB(0x24e3858)
    

    但是,这可能会破坏您的程序,因为您的程序可能需要 GLOB,并且不是对 GLOB 的引用。 p>

    【讨论】:

    • 什么是 GLOB 文件句柄?
    • 实际上,破坏程序的可能性不大。期望句柄的事物通常接受对 IO 对象 (*STDOUT{IO})、glob (*STDOUT) 和对 glob (\*STDOUT) 的引用。
    • @ikegami 我猜比抱歉更安全。
    • 如果你想安全起见,你需要一个 glob (\*STDOUT) 的引用,因为这就是 open(my $fh, ...) 放入 $fh 的内容。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-13
    • 2012-08-14
    • 1970-01-01
    • 1970-01-01
    • 2013-04-10
    • 2015-05-10
    相关资源
    最近更新 更多