【发布时间】:2026-02-11 07:15:01
【问题描述】:
STDOUT 有“类型”吗?
printf STDERR ("STDOUT = %s\n", STDOUT);
printf STDERR ("\*STDOUT = %s\n", *STDOUT);
printf STDERR ("\\\*STDOUT = %s\n", \*STDOUT);
生产:
STDOUT = STDOUT
*STDOUT = *main::STDOUT
\*STDOUT = GLOB(0x600078848)
我了解*main::STDOUT 和GLOB(0x600078848) 条目。 “裸词”让我很好奇。
我问是因为我想将一个类似文件句柄的参数传递给方法调用。在“C”中,我会使用文件描述符或文件 *。我希望它默认为 STDOUT。我所做的是:
$OUT_FILE_HANDLE = \*STDOUT;
if(@ARGV > 0 ) {
open($OUT_FILE_HANDLE, ">", "$ARGV[0]") or die $!;
}
它有效,但我不知道我做了什么。我搞砸了STDOUT吗?我怀疑我已经“破坏”(覆盖)了 STDOUT,这不是我想要的。
请原谅复合问题;他们似乎是相关的。
【问题讨论】:
-
printf STDERR ("STDOUT = %s\n", STDOUT);中的STDOUT是“诗歌优化”兼容性错误功能的一个示例——STDOUT裸字被视为文字字符串,与"STDOUT"相同。这是use strict的错误,您应该始终使用它。至于您声称理解 typeglobs 和句柄 - 非常适合您!我总是必须考虑它们是如何在解释器中实现的,以便理解混乱。
标签: perl stdout filehandle