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