Perl缓冲输出

Perl缓冲输出,perl,cgi,Perl,Cgi,我正在更改现有解决方案中的一些Perl脚本。由于升级(Windows)服务器时发生了一些变化,我将它们从运行ISAPI切换到CGI。这意味着我现在必须手动发送内容类型,否则将失败 所以我需要启用输出缓冲(print语句,So STDOUT),发送内容类型:text/html,但是在重定向的情况下,我需要清除输出缓冲并发送新的头 我该怎么做 还是有别的办法?请注意,脚本已经在使用print输出HTML,我无法更改这一点。(这本书写于90年代初。) 最安全的方法之一(IMO)是在输出任何其他内容之前

我正在更改现有解决方案中的一些Perl脚本。由于升级(Windows)服务器时发生了一些变化,我将它们从运行ISAPI切换到CGI。这意味着我现在必须手动发送内容类型,否则将失败

所以我需要启用输出缓冲(print语句,So STDOUT),发送内容类型:text/html,但是在重定向的情况下,我需要清除输出缓冲并发送新的头

我该怎么做

还是有别的办法?请注意,脚本已经在使用
print
输出HTML,我无法更改这一点。(这本书写于90年代初。)

最安全的方法之一(IMO)是在输出任何其他内容之前,将决定是否要重定向所需的所有逻辑放在脚本的顶部

如果您根本不想更改原始脚本,请编写一个单独的脚本,只执行重定向/内容类型逻辑,然后在必要时调用原始脚本。

您无法“撤消”打印到标准输出的
。在向标准输出发送任何内容之前,您需要决定是生成HTML输出还是重定向

一种方法是
选择一个内存缓冲区而不是标准输出:

my $buffer = '';
open(my $out, '>', \$buffer) or die;
select($out);
print "Content-Type: text/html\n\n";

if (generate_redirect) {
  print STDOUT "Location: login.pl\n\n";
} else {
  print STDOUT $buffer;
}
一旦确定不会生成重定向,就可以重新选择标准输出并输出缓冲区:

select STDOUT;
print $buffer;
print "<p>HTML now goes to client instead of \$buffer</p>\n";
选择标准输出;
打印$buffer;
打印“HTML现在转到客户端,而不是\$buffer

\n”;
一个尚未涉及的答案是,在BEGIN中将STDOUT默认句柄替换为另一个句柄,然后在END中处理它,如果没有标题,则添加
内容类型:text/html\n\n
。丑陋,但应该有效。。。从理论上讲。

好的,所以这个问题的答案是否定的。所以我承担了手动更新所有脚本以正确发送标题的工作。谢谢
select STDOUT;
print $buffer;
print "<p>HTML now goes to client instead of \$buffer</p>\n";