2011-09-07 126 views
2

我正在改变现有解决方案中的一些Perl脚本。由于升级(Windows)服务器时发生了一些变化,我将它们从运行ISAPI切换到CGI。这意味着我现在必须手动发送Content-Type,否则会失败。所以我需要启用输出缓冲(打印语句,所以STDOUT),发送Content-Type:text/html,但在它是重定向的情况下,我需要清除输出缓冲区并发送新的头文件。Perl缓冲输出

我该怎么做?

或者还有另外一种方法吗?请注意,该脚本已经在使用print来输出HTML,而我无法改变它。 (这是写在90年代初。)

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

回答

6

您不能“撤消”print到标准输出。您需要决定是否生成HTML输出或在之前向STDOUT发送任何内容之前的重定向

这样做将是一个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和输出缓冲器:

尚未覆盖被简单地替换STDOUT默认手柄到不同的手柄在BEGIN,则处理它END加入Content-Type: text/html\n\n如果没有头
select STDOUT; 
print $buffer; 
print "<p>HTML now goes to client instead of \$buffer</p>\n"; 
+0

好的,所以这个问题的答案是NO。所以我开始手动更新所有脚本以正确发送标题。谢谢。 –

1

一个这样做的最安全的(IMO)的方法是把你需要决定是否要重定向或不顶端的所有逻辑的脚本,之前你输出任何东西。

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

0

一个答案。丑陋,但应该在理论上起作用。