perl中文件句柄的指针

时间:2017-09-26 14:14:07

标签: perl

参考以下内容:

Pencil

想要了解最后两行的作用,第二行输出FILE所具有的任何内容(直到达到第二行的点)到$ file表示的文件,然后存储FILE的引用(引用由文件处理程序表示的* FILE)成为一个有福的哈希键(这里$ self是一个有福的哈希引用)。如果我的理解是正确的,请告诉我。 Can * FILE可以替换为\ FILE吗?

1 个答案:

答案 0 :(得分:3)

,无法替换为\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本身就是一个被分配的东西。但它不是一个参考。这显示了奇怪的类型是什么,并且这种文件句柄令人困惑,不应该使用。

但如果你做\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的引用