Perl缓冲输出

时间:2011-09-07 08:04:24

标签: perl cgi

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

所以我需要启用输出缓冲(print语句,所以STDOUT),发送Content-Type:text / html,但是在重定向的情况下我需要清除输出缓冲区并发送新的标题。

我该怎么做?

还是有另一种方式吗?请注意,该脚本已使用print输出HTML,我无法更改。 (它写于90年代初期。)

select(STDOUT);
$| = 0;
print "Content-Type: text/html\n\n";
# somehow clear output
print "Location: login.pl\n\n";

3 个答案:

答案 0 :(得分:6)

您无法将print“撤消”为STDOUT。在向STDOUT发送任何内容之前,您需要决定是生成HTML输出还是重定向

这样做的一种方法是select内存缓冲区而不是STDOUT:

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并输出缓冲区:

select STDOUT;
print $buffer;
print "<p>HTML now goes to client instead of \$buffer</p>\n";

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

一个尚未涵盖的答案就是将STDOUT默认句柄替换为BEGIN中的不同句柄,然后在END中处理它,如果没有标题则添加Content-Type: text/html\n\n。丑陋,但理论上应该有效。