2017-08-30 88 views
0

我正嘗試從運行在執行一個打印的HTML代碼大量Perl庫特定的子程序。之後做一些研究,我發現,這是可以使用select()方法來暫時改變print輸出,比方說,STDERR,從前端完全隱藏,然後將其恢復到標準輸出,一旦庫已完成其工作。故障,方法是在覆蓋庫

很簡單,但對我來說這不需額外的工作。出於某種原因,有人在與上述內容無關的關鍵庫內創建了一個方法select(),但它是一種與我們的數據庫進行交互的方法。因此,每當我嘗試使用my $filehandler = select(STDERR);時,我都會得到數據庫方法,這會導致錯誤。而且我不能評論這個方法,或者從該庫中的導出方法中刪除它,而不會在其他腳本上造成太多麻煩 - 包括我試圖運行的庫。

我不能甚至使用HTML註釋塊擺脫這一點,因爲圖書館也打印評論。有沒有其他方法可以運行正確的select()方法?或者任何其他替代方法暫時阻止HTML被打印?

編輯:作爲參考,我的Perl版本是專爲x86_64的Linux的線程多

+2

也許... http://perldoc.perl.org/CORE.html – toolic

+0

或者https://stackoverflow.com/a/3673935/1207195 –

+0

它被稱爲「文件句柄」(它擁有一個資源),不是一個文件處理程序(它不處理事件) – ikegami

回答

5

如在comment by toolic已經提到的,最明顯的解決方案是使用CORE::select v5.10.1(*)。 CORE::命名空間總是給你內建的。

sub select { 1; } 

sub html { 
    print "<html></html>"; 
} 

open my $string_fh, '>', \my $string or die $!; 
my $stdout = CORE::select $string_fh; 

html(); 

CORE::select $stdout; 
print "hello world"; 

作爲替代,你可以使用Capture::Tiny,這真的只是做同樣的事情引擎蓋下,但看起來更好。

use Capture::Tiny 'capture'; 

my ($stdout, undef, undef) = capture { html() }; 

順便說一句,這可能是重構一個很好的時間select功能,並使用它,並告訴你有多喜歡他們的同事的所有代碼。此外,請觀看與該主題相關的this talk from the Swiss Perl Workshop 2017

+0

讓我想起了我需要刪除'%INC'東西的時間,實現了我們有'使用瓦爾「%INC''一些奇怪的全球散東西,這是共享產品.pl文件之間的詳細信息... – simbabque

+0

'CORE :: select'對我來說就像一個魅力!我不認爲我需要爲此導入一個庫。現在,對不起,如果這看起來像一個愚蠢的問題,但是'html()'的輸出到@simbabque的輸出在哪裏呢?我以爲我不得不將它重定向到STDERR,但它不在那裏。它被丟棄了嗎? –

+0

@JorgeFreitas你當然可以將它重定向到STDOUT,但你不必這樣做。這意味着它會在你的Web服務器的錯誤日誌中出現,你的系統管理員不會非常喜歡它。我們打開一個句柄來寫入一個變量,這就是'\ my $ string'所做的。你的輸出是在那個變量上,你甚至可以在以後使用它,或者在使用它之前改變它。 – simbabque