我想关闭STDOUT以防止我的代码输出我需要进一步计算但不想在我的网页上的特定图像.
所以我想关闭STDOUT,做我必须做的代码,然后重新打开STDOUT将内容输出到网页.(不是文件)
我尝试的是:
close STDOUT;
# my code here
open STDOUT;
Run Code Online (Sandbox Code Playgroud)
这不起作用......
谢谢
在下面的小代码中,我没有收到行 [09] 和 [18] 的错误或警告。我得到的唯一警告是第 [21] 行:
use strict; # [01]
use warnings FATAL => 'unopened'; # [02]
# [03]
open(my $outHandleA, ">outputA.txt") or die ("A: $!\n"); # [04] Opened $outHandleA
print $outHandleA "FILE A\n"; # [05]
close $outHandleA; # [06] Closed $outHandleA
# [07]
print $outHandleA; # [08]
print $outHandleA "ABC\n"; # [09] <---
print $outHandleA; # [10]
print "-----"; # [11]
# [12]
open(OUT, ">outputB.txt") or die ("B: $!\n"); # [13] Opened OUT
print OUT "FILE B\n"; # …Run Code Online (Sandbox Code Playgroud) STDOUT是否有“类型”?
printf STDERR ("STDOUT = %s\n", STDOUT);
printf STDERR ("\*STDOUT = %s\n", *STDOUT);
printf STDERR ("\\\*STDOUT = %s\n", \*STDOUT);
Run Code Online (Sandbox Code Playgroud)
产生:
STDOUT = STDOUT
*STDOUT = *main::STDOUT
\*STDOUT = GLOB(0x600078848)
Run Code Online (Sandbox Code Playgroud)
我了解*main::STDOUT和GLOB(0x600078848)条目。这个“流行语”让我感到好奇。
我问是因为我想将类似文件句柄的参数传递给方法调用。在“ C”中,我将使用文件描述符或File *。我希望它默认为STDOUT。我所做的是:
$OUT_FILE_HANDLE = \*STDOUT;
if(@ARGV > 0 ) {
open($OUT_FILE_HANDLE, ">", "$ARGV[0]") or die $!;
}
Run Code Online (Sandbox Code Playgroud)
它可以工作,但是我不知道我到底做了什么。我提升了STDOUT吗?我怀疑我已经“毁了”(覆盖)STDOUT,这不是我想要的。
请原谅复合问题;他们似乎有关。
在编写守护进程时,我想关闭STDIN,STDOUT和STDERR以获得"良好的守护进程行为".但我很惊讶.后续打开文件需要与旧STDIN,STDOUT和STDERR相同的属性(因为它们的fileno-s被重新打开了?)
这是warn.pl:
use warnings;
my $nrWarnings = 0;
$SIG{__WARN__} = sub {
no warnings;
$nrWarnings++;
open my $log, '>>', '/tmp/log.txt'
or die;
printf $log "%d: %s", $nrWarnings, @_;
close $log;
};
close STDOUT;
close STDERR;
close STDIN;
open my $o, '>', '/tmp/foobar.txt'
or die;
open my $i, '<', '/etc/passwd'
or die;
open my $i2, '<', '/etc/passwd'
or die;
open my $i3, '<', '/etc/passwd'
or die;
exit $nrWarnings;
Run Code Online (Sandbox Code Playgroud)
在这里我运行它:
> rm -f /tmp/log.txt ; perl warn.pl; echo $? ; cat /tmp/log.txt …Run Code Online (Sandbox Code Playgroud)