2011-09-07 127 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

一個答案。醜陋,但應該在理論上起作用。