否,不能用\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>