相关疑难解决方法(0)

如何在Perl中关闭并重新打开STDOUT?

我想关闭STDOUT以防止我的代码输出我需要进一步计算但不想在我的网页上的特定图像.

所以我想关闭STDOUT,做我必须做的代码,然后重新打开STDOUT将内容输出到网页.(不是文件)

我尝试的是:

    close STDOUT;
    # my code here
    open STDOUT;
Run Code Online (Sandbox Code Playgroud)

这不起作用......

谢谢

perl cgi stdout

10
推荐指数
2
解决办法
8954
查看次数

尝试打印到已关闭的文件句柄没有错误或警告

在下面的小代码中,我没有收到行 [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)

perl warnings filehandle

7
推荐指数
1
解决办法
144
查看次数

STDOUT是什么类型,如何选择写入?

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::STDOUTGLOB(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,这不是我想要的。

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

perl stdout filehandle

4
推荐指数
2
解决办法
192
查看次数

当STDIN,STDOUT和STDERR关闭时perl bug?

在编写守护进程时,我想关闭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)

perl

3
推荐指数
2
解决办法
2271
查看次数

标签 统计

perl ×4

filehandle ×2

stdout ×2

cgi ×1

warnings ×1