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

Ita*_*ics 10 perl cgi stdout

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

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

我尝试的是:

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

这不起作用......

谢谢

mob*_*mob 11

有几种方法可以解决您的问题,其中许多方法都不需要您关闭STDOUT并冒着满足程序标准I/O通道的风险.

例如,您可以使用(1-arg)select命令print暂时将命令输出定向到其他位置.

 print $stuff_you_want_to_send_to_STDOUT;

 select(NOT_STDOUT);
 # now default print sends things to NOT_STDOUT.
 # This doesn't need to be a real filehandle, though you may get warning
 # messages if it is not.
 ...;
 print $the_image_you_dont_want_to_go_to_STDOUT;
 ...;

 select(STDOUT);
 # now  print  sends things to STDOUT agin
 print $more_stuff_you_do_want_to_go_to_STDOUT;
Run Code Online (Sandbox Code Playgroud)

您还可以*STDOUT在运行时重新分配glob而不关闭任何句柄.

 *OLD_STDOUT = *STDOUT;
 print $for_STDOUT;

 *STDOUT = *NOT_STDOUT;     # again, doesn't need to be a real filehandle
 print $stuff_to_suppress;

 *STDOUT = *OLD_STDOUT;     # restore original STDOUT
 print $more_stuff_for_STDOUT;
Run Code Online (Sandbox Code Playgroud)


ike*_*ami 6

关闭STDOUT是不好的,因为很多人认为它总是开放的.最好将其重定向到/dev/null(unix)或nul(Windows).

如果要重定向文件描述符,

use Sub::ScopeFinalizer qw( scope_finalizer );

{
    open(my $backup_fh, '>&', \*STDOUT) or die $!;
    my $guard = scope_finalizer { open(STDOUT, '>&', $backup_fh) or die $!; };
    open(STDOUT, '>', '/dev/null') or die $!;

    ...
}
Run Code Online (Sandbox Code Playgroud)

如果你只想重定向STDOUT,

{
    local *STDOUT;
    open(STDOUT, '>', '/dev/null') or die $!;

    ...
}
Run Code Online (Sandbox Code Playgroud)

如果您只想重定向默认输出句柄,

use Sub::ScopeFinalizer qw( scope_finalizer );

{
    open(my $null_fh, '>', '/dev/null') or die $!;
    my $backup_fh = select($null_fh);
    my $guard = scope_finalizer { select($backup_fh); };

    ...
}
Run Code Online (Sandbox Code Playgroud)