gpt4 book ai didi

perl - STDOUT 是什么类型,我如何选择写入它?

转载 作者:行者123 更新时间:2023-12-04 22:17:58 27 4
gpt4 key购买 nike

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::STDOUTGLOB(0x600078848) 条目。 “裸词”让我很好奇。

我问是因为我想将类似文件句柄的参数传递给方法调用。在“C”中,我会使用文件描述符或 File *.我希望它默认为 STDOUT。我所做的是:
$OUT_FILE_HANDLE = \*STDOUT;
if(@ARGV > 0 ) {
open($OUT_FILE_HANDLE, ">", "$ARGV[0]") or die $!;
}

它有效,但我不知道我到底做了什么。我搞砸了标准输出吗?我怀疑我“毁了”(覆盖)标准输出,这不是我想要的。

请原谅这个复合问题;他们似乎有关系。

最佳答案

来自 perlvar :

Perl identifiers that begin with digits or punctuation characters are exempt from the effects of the package declaration and are always forced to be in package main; they are also exempt from strict 'vars' errors. A few other names are also exempt in these ways: [...] STDOUT



因此, STDOUT 是一个包含预先打开的文件句柄的全局变量。

来自 perlfunc :

If FILEHANDLE is an undefined scalar variable (or array or hash element), a new filehandle is autovivified, meaning that the variable is assigned a reference to a newly allocated anonymous filehandle. Otherwise if FILEHANDLE is an expression, its value is the real filehandle.



您的 $OUT_FILE_HANDLE 不是未定义的,因此它的值 STDOUT 正在被打开。 AFAIK,如果你打开一个已经打开的句柄,它首先被隐式关闭。

有几种方法可以做你想做的事。从上面的引用中可以明显看出第一个 - 不要在 $OUT_FILE_HANDLE 之前定义 open :
if (@ARGV > 0 ) {
open($OUT_FILE_HANDLE, ">", "$ARGV[0]") or die $!;
} else {
$OUT_FILE_HANDLE = \*STDOUT;
}
# do stuff to $OUT_FILE_HANDLE

另一种是使用 select ,因此您不需要传递文件句柄:
if (@ARGV > 0 ) {
open($OUT_FILE_HANDLE, ">", "$ARGV[0]") or die $!;
select $OUT_FILE_HANDLE;
}
# do stuff (without specifying a file handle)
select STDOUT;

关于perl - STDOUT 是什么类型,我如何选择写入它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57155796/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com